0

asp.net 4.0 で FileUpload コントロールを使用するファイル アップロード フォームがあります。アップロード ボタンで、次のようないくつかの制限について送信されているファイルを確認します。

FileUpload fu = new FileUpload();

    if (fu.HasFile)
    {
        if ((extension == ".jpg") || (extension == ".png") || (extension == ".gif"))
        {
             if (fu.PostedFile.ContentLength <= 2MB)
             {
                 fu.SaveAs("path"); // save the file on the server
                 // check file header ...       
             }
         }
    }

問題は、クライアントでこれをチェックして設定したエラーを表示する代わりに、ビデオ (明らかに異なる拡張子とサイズ > 2MB を持っている) を送信すると、それがアップロードされ、クライアントがエラーを受け取ることです。問題は、クライアントが 1 GB のファイルを送信した場合にどうなるか?! つまり、拡張子とサイズの検証から SaveAs() にどのように渡されるのか、理解できません。ご意見はありますか?ありがとう!

4

3 に答える 3

2

残念ながら、そのコードはサーバー上で実行されます。つまり、ファイルがアップロードされた後にのみ、これらのチェックを行うことができます。

ユーザーが非常に大きなファイルをアップロードしようとすると、要求の長さの制限 (web.config で定義) がそれをキャッチし、制限に達するとアップロードが中止されます。

それ以外には、サーバー上のファイルを実際にチェックする必要があります。拡張子だけでなく、それ以上のものをチェックする必要があります。誰かがファイルの拡張子を別のものに簡単に変更できます。それは実際の問題である場合とそうでない場合がありますが、ほとんどの場合問題です。(他に何もなければ、たとえば、ブラウザーが Word 文書を画像であるかのように読み込もうとしたときに、後続の Web サイト ユーザーに壊れた画像のプレースホルダーが表示されます)。

于 2013-03-01T11:33:11.330 に答える
0

html5 を使用している場合は、FileReader を使用できます。 FileReader Javascript

  1. サイズ、コンテンツ タイプについてクライアント側から検証できます。
  2. 検証されたら、サーバーに投稿できます。

から取得したコード: FileReader Javascript

<script>
  function handleFileSelect(evt) {
    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
      output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
                  f.size, ' bytes, last modified: ',
                  f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
                  '</li>');
    }
    document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
  }

  document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

ファイルリーダーのポリフィル

  1. ファイルリーダーのポリフィル
  2. ブラウザのサポート。
于 2013-03-01T11:36:15.137 に答える
0

これはあなたの実際のコードですか?2MBとは?文字列でも整数でもありません。私はそれがコンパイルされたことに驚いています。次のようなものが必要です。

 int iFileSize = file.ContentLength;


    if (iFileSize > 1000000)  // 1MB approx (actually less though)
    {
        // File is too big so do something here
        return;
    }
于 2013-03-01T11:36:28.433 に答える