【问题标题】:FileUpload control uploading file when it shouldn'tFileUpload 控制不应该上传文件
【发布时间】:2013-02-15 21:17:27
【问题描述】:

我有一个在 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(),我无法理解。 有什么意见吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了,我现在记得在我的 web.config 文件中我设置了 maxRequestLength="40960" 这意味着请求是一次上传 40 MB。我的问题是,由于用户可以上传多个文件(每个文件都通过它自己的 FileUpload 控件),如果我将 maxRequestLength 设置为 1MB,那么对于每个文件上传控件还是所有控件的所有文件大小的总和?所有图片(最多 20 张)都是通过单击按钮上传的,所以这是一个请求吗?
    • @osmiumbin 其实是针对整个request;所以是的,所有文件都将包括在内,加上 HTTP 请求的其余部分(例如 cookie、路径、查询字符串值、其他表单值等)
    • 好吧,我可以限制每个文件的请求吗?我只是不希望用户能够提交他们想要的任何文件大小。它消耗带宽和其他不好的东西。谢谢。
    【解决方案2】:

    如果您使用的是 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>
    

    文件阅读器的polyfills

    1. Filereader polyfill
    2. Browser Support.

    【讨论】:

    • 对不起,我不会使用 html5。并非所有浏览器都支持它。谢谢。
    • @osmiumbin 你可以使用 polyfilss。
    【解决方案3】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2013-04-22
    • 2012-12-27
    • 2016-04-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多