小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


ファイルアップロード時にファイルサイズをチェックしたい

はじめに

ASP.NETで作成したファイルアップロードの処理で、アップロードされるファイルのサイズをチェックすることができるのかどうかを調べてみました。

結論
  • サーバサイドでのチェックは難しい。
    • アップロードされたファイルのサイズは調べられるが、ある条件によってはチェックできない場合がある。
  • アップロード前にJavaScriptとActiveXを用いてファイルサイズをチェックすることはできる。ただし、通常のセキュリティ設定の場合は、スクリプトの実行前に警告がでる。
サーバサイドでのファイルサイズのチェック

ASP.NETでアップロードされたファイルのサイズを調べるには、HttpPostedFile.ContentLengthプロパティを参照すればわかります。

ただし、アップロードできるファイルの最大サイズを規定しているHttpRuntimeSection.MaxRequestLength プロパティ (System.Web.Configuration) はてなブックマーク - HttpRuntimeSection.MaxRequestLength プロパティ (System.Web.Configuration)の値(規定値は4MB)を超えるファイルがアップロードされた場合は、例外が発生し、サーバサイドのプログラムまで処理がわたりません。

httpRuntime要素のmaxRequestLengthの設定値を超えた場合、
Webページまで処理が届かないのは、ご存知の通りです。
10MBのファイルをアップロードすれば、数十秒経過後に
ブラウザが真っ白になるか、HTTPエラーになったはずです。
ファイルアップロードの際のファイルサイズ制限について − Insider.NET − @IT はてなブックマーク - ファイルアップロードの際のファイルサイズ制限について − Insider.NET − @IT

このため、maxRequestLengthの値を変更し、十分な余裕をとった上でファイルサイズをチェックすることは可能ですが、仮にmaxRequestLengthの値を超えたサイズのファイルがアップロードされてきた場合には、チェック処理は実行されず、HTTPエラーとなってしまいます。

アップロードする前にクライアントサイドでチェックする

では、アップロードする前にファイルサイズを調べられないかというと、調べることは可能です。この場合、ActiveXオブジェクトを使用した以下のようなコードでファイルサイズを調べることができます。

function hoge(fileName) {
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  if (fso.FileExists(fileName)) {
    var objFile = fso.getFile(fileName);
    alert(objFile.size);
  }
}

ただし、ActiveXオブジェクトを利用すると、スクリプトの実行前に以下のような警告ダイアログが表示されます。

まとめ

ActiveXの警告がでてもOKという場合には、クライアントサイドでチェックすることができます。ただし、ブラウザのJavaScriptが無効の場合には動作しないので注意が必要です。サーバサイドのチェックは、僕が調べた限り、確実といえる手段がないようです。