ここから本文です

FILEFIELDコントロールで選択されるファイルのサイズを1メガ以内に留めたい。

say********さん

2009/9/2512:23:58

FILEFIELDコントロールで選択されるファイルのサイズを1メガ以内に留めたい。

昨日からあらゆるホームページをあさって上記対処方法を模索していますが、ASP.NET初心者のために
それらスクリプトをうまく採用できず頭を悩ましています。

どれが手っ取り早く、簡単なのでしょうか?
以下はJavaScriptのようなのですが、ここまで記載されていても私は知識のなさから
自分のVB(Script)部分に採用できず、シンタックスエラーを招いてしまいます。

JavaScriptで
function fnOnClick() {
Fs = new ActiveXObject("Scripting.FileSystemObject");
if ( Fs.FileExists(document.all.uploaded_file.value) ) {
fl = Fs.getFile(document.all.uploaded_file.value);
alert(fl.size);

} else {
alert("ファイル名が無効です");
}
}


上記JavaScriptの採用が望ましい場合は、具体的にVBへ採用する方法、
その他に良しとされる方式がございましたらごなたかご教示頂けませんでしょうか?
変な質問ですみません。

補足ttkai00さん、いつもお世話になっております。
サーバーにあがってしまってから検知する機能ではユーザをいらいらさせるな、と思いクライアント側での検知で模索していました。
PostedFileというのは実際どうなのでしょうね?

私は5分もかかってあるファイルがアップロードし終わり、
その後に「容量が大きすぎます」と警告が出ることは避けたいのです。

閲覧数:
633
回答数:
1
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

ttk********さん

編集あり2009/9/2809:54:23

まず確認ですが、クライアントサイドでファイルのサイズをチェックすることがどうしても必要でしょうか?サーバーサイドでチェックを行うことも可能ですが。というのも、クライアントサイドでのファイルのサイズのチェックは、基本的にはできないからです。

ブラウザで動作する JavaScript のようなスクリプトでは、ローカルファイルへのアクセスはセキュリティ上の問題からできません。これができてしまうと例えば、悪意のあるページにアクセスしただけで、CドライブやDドライブのファイルが削除されたり、書き込まれたりする可能性がありますよね。

実は抜け道はあって、Windows で動作する Internet Explorer では ActiveX という技術を用いて、これを可能にしています。とはいえ、最近のバージョンでは実行前に必ず警告が出るようになっていますし、IE以外のブラウザでは全く動作しないという制約もあり、あまり推奨される方法ではありません。で、その ActiveX を使った方法が、質問者さんがやろうとしている方法になります。

サーバーサイドでのサイズチェックなら PostedFile プロパティを使って簡単に処理できます。そちらの方が一般的ですが、それではまずいでしょうか?

※補足を受けて

> 5分もかかってあるファイルがアップロードし終わり、
> その後に「容量が大きすぎます」と警告が出ることは避けたい

気持ちはわからなくもないですが、Web アプリケーションでは、サーバーにアップロードされた後にチェックされるのが一般的です。それは ASP.NET だろうと Java だろうと PHP だろうと同じです。もっともその理由は、前述した通り、セキュリティ上の制約があるからですけどね。それがなければ、クライアントサイドでチェックした方が、ユーザビリティが高いと言えるのでしょうが。

ActiveX を使う方法は一応ありますが、先に書いたように Windows の IE 限定になります。しかもブラウザの警告メッセージが出るので、あまり使いやすいともいえないと思います。

ということで私なら、諦めてサーバーサイドのチェックのみにすると思います。IEだけ対応するのも微妙な気がしますし、あまり ActiveX を使うのは好きではないです。アップロードする画面に「ファイルのサイズは○MB以内です」のように、注意書きを書くくらいでしょうね。



一応質問の本題にも触れておきます。私もこの方法をやったことはないので詳しくはないのですが…

おそらく、document.all.uploaded_file というのが見つからなくてエラーになっているのではないでしょうか?

ASP.NET のコントロールのクライアント側のIDを取得して、JavaScript 経由でアクセスしなければならないので、この部分は静的な JavaScript では無理です。ASP.NET からの引数を受け取れるように構造を変える必要があるでしょう。

function fnOnClick(fileFieldId) {
// IE限定
if (document.all) {
var Fs = new ActiveXObject("Scripting.FileSystemObject");
var fileField = document.getElementById(fileFieldId);
var fileFieldValue = fileField.value;
if (Fs.FileExists(fileFieldValue)) {
var fl = Fs.getFile(fileFieldValue);
// サイズチェック
if (fl.size > 10000) {
alert("ファイルのサイズが大きすぎます。");
return false;
}
} else {
alert("ファイル名が無効です");
return false;
}
}
return true;
}

こんな感じに、fileFieldの ID を関数が受け取れるような形で関数を定義します。その上で、Page_Load などで、アップロードを行う ASP.NET のボタンに onclick の Attribute を追加します。

Button1.Attributes.Add("onclick", "return fnOnClick(" + HtmlInputFile1.ClientID + ")")

Button1, HtmlInputFile1 は適宜置き換えてください。

全然検証できていないのではずしてたらすみません。

質問した人からのコメント

2009/9/29 12:01:33

ご丁寧にありがとうございます。改めて日頃のご協力に御礼申し上げます。
今回はサーヴァー側での検知及び、クライアント側の検知をあきらめることとしました。一応にご提示頂きましたコーディングを自身のスクリプト部分へ貼り付けてみましたが、貼り付け場所が悪いのか何かがたりないのかでエラーとなってしまいました。私が未熟で活かしきれませんでした、申し訳ないです。

WebConfigで最大サイズを定義することにとどめました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる