FileUpload控件上传文件时不应该

时间:2013-03-01 11:25:58

标签: asp.net .net file-upload upload controls

我有一个在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)而不是在客户端上检查这个并给出我已设置的错误时,它上传它然后客户端收到错误。如果客户端提交1GB文件会出现问题?!我的意思是,它如何从扩展和大小验证传递到SaveAs(),我无法理解。 任何意见?谢谢!

3 个答案:

答案 0 :(得分:2)

不幸的是,该代码在服务器上运行,这意味着它只能在上传文件后进行检查。

如果用户尝试上传非常大的文件,请求长度限制(在web.config中定义)将捕获它,并且一旦达到限制就会中止上传。

除此之外,你真的必须检查服务器上的文件;你应该检查的不仅仅是扩展名。有人可以轻松地将文件的扩展名更改为其他内容。这可能是也可能不是实际问题 - 但最有可能的是! (如果没有别的,后续网站用户会在浏览器尝试加载Word文档时看到损坏的图像占位符,就像它是图像一样)

答案 1 :(得分:0)

如果您使用的是html5,则可以使用FileReader。 FileReader Javascript

  1. 您可以从客户端验证尺寸,内容类型。
  2. 一旦验证,您可以将其发布到服务器。
  3. 代码取自: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>
    

    文件阅读器的polyfills

    1. Filereader polyfill
    2. Browser Support.

答案 2 :(得分:0)

这是您的实际代码吗?什么是2MB?它不是字符串或整数。甚至编译我都很惊讶。你应该有这样的东西:

 int iFileSize = file.ContentLength;


    if (iFileSize > 1000000)  // 1MB approx (actually less though)
    {
        // File is too big so do something here
        return;
    }