Asp.net FileUpload控件在不应上载文件时上载文件';T

Asp.net FileUpload控件在不应上载文件时上载文件';T,asp.net,.net,file-upload,upload,controls,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.Poste

我有一个文件上传表单,它在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 ...       
             }
         }
    }
 int iFileSize = file.ContentLength;


    if (iFileSize > 1000000)  // 1MB approx (actually less though)
    {
        // File is too big so do something here
        return;
    }
FileUpload fu=newfileupload();
if(fu.HasFile)
{
if((扩展名=“.jpg”)| |(扩展名=“.png”)| |(扩展名=“.gif”))
{
如果(fu.PostedFile.ContentLength 2MB)没有在客户端上检查并给出我设置的错误,它会上载它,然后客户端收到错误。问题是如果客户端提交1GB文件怎么办?我的意思是,它如何从扩展名和大小验证传递到SaveAs(),我不明白。

有什么意见吗?谢谢!

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

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


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

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

  • 您可以从客户端验证大小、内容类型
  • 验证后,您可以将其发布到服务器
  • 代码取自:

    
    功能手柄文件选择(evt){
    var files=evt.target.files;//文件列表对象
    //文件是文件对象的文件列表。请列出一些属性。
    var输出=[];
    for(var i=0,f;f=files[i];i++){
    output.push(“
  • ”,escape(f.name),“(”,f.type | | |“n/a”,“)-”, f、 大小,'字节,上次修改:', f、 lastModifiedDate?f.lastModifiedDate.toLocaleDateString():“不适用”, “
  • ”); } document.getElementById('list').innerHTML='
      '+output.join('')+'
    '; } document.getElementById('files').addEventListener('change',handleFileSelect,false);
    文件读取器的多边形填充


  • 这是您的实际代码吗?什么是2MB?它不是字符串或整数。我很惊讶它竟然被编译。您应该有这样的代码:

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

    这不是确切的代码,它只是我的代码的一种更简单的表示形式。谢谢,你可以附加一个客户端事件来验证正在上载的文件的内容。请检查:抱歉,我不会使用html5。不是所有浏览器都支持它。谢谢。@osmiumbin你可以使用polyfilss。我知道了,我现在记得在我的web.config文件中我有设置maxRequestLength=“40960”,这意味着请求一次上载40MB。我的问题是,由于用户可以上载多个文件(每个文件都通过自己的FileUpload控件),如果我将maxRequestLength设置为1MB,那么每个FileUpload控件的大小或所有控件中所有文件大小的总和是多少?所有图像(最大20个)通过点击按钮上传,这是一个请求吗?@osmiumbin这实际上是整个请求;因此,是的,所有文件都将包括在内,再加上HTTP请求的其余部分(如cookie、路径、查询字符串值、其他表单值等)嗯,我能限制每个文件的请求吗?我只是不希望用户能够提交他们想要的任何文件大小。这会消耗带宽和其他不好的东西。谢谢。