2011-04-18 83 views
30

我想简单地限制用户可以上传的文件的大小。限制文件上传的大小(html输入)

我认为maxlength = 20000 = 20k,但这似乎并没有工作。

我on Rails的,而不是PHP运行,但想它一定会觉得很简单做客户端的HTML/CSS,或者作为最后的手段使用jQuery。这是非常基本的,但必须有一些我缺少或不知道的HTML标签。

寻求支持IE7 +,Chrome,FF3.6 +。我想如果有必要的话,我只能支持IE8 +。

谢谢。

+1

这是可能的。请参阅[this](http://stackoverflow.com/questions/3717793/javascript-file-upload-size-validation)问题。 – sandSK 2014-06-16 05:01:01

回答

17

你不能在客户端做它。你必须在服务器上完成它。

编辑:此答案已过时!

作为此编辑的时间,HTML文件API是mostly supported on all major browsers

我会提供解决方案的更新,但@ mark.inman.winning already did it

请记住,即使现在可以在客户端上进行验证,但您仍然应该在服务器上验证它。所有客户端验证都可以被绕过。

+2

你说这是不可能做到客户端?必须有一个优雅的解决方案客户端...我不喜欢“不可能”这个词:) – delphi 2011-04-18 01:13:43

+2

是的,现在是不可能的。 HTML5中有一些新的文件API的草案,但目前没有浏览器完全支持它。 – Andre 2011-04-18 01:15:51

+2

请参阅:http://www.cs.tut.fi/~jkorpela/forms/file.html,“对文件大小设置限制”,以及为什么尝试执行它的客户端毫无意义。 – magma 2011-04-18 01:17:41

57

这是完全可能的。使用Javascript。

我使用jQuery来选择输入元素。我已经设置了一个改变事件。

$("#aFile_upload").on("change", function (e) { 

    var count=1; 
    var files = e.currentTarget.files; // puts all files into an array 

    // call them as such; files[0].size will get you the file size of the 0th file 
    for (var x in files) { 

     var filesize = ((files[x].size/1024)/1024).toFixed(4); // MB 

     if (files[x].name != "item" && typeof files[x].name != "undefined" && filesize <= 10) { 

      if (count > 1) { 

       approvedHTML += ", "+files[x].name; 
      } 
      else { 

       approvedHTML += files[x].name; 
      } 

      count++; 
     } 
    } 
    $("#approvedFiles").val(approvedHTML); 

}); 

上面的代码保存了所有的文件名,我认为值得坚持提交页面,在提交实际发生之前。我使用jQuery将“已批准”文件添加到输入元素的val,因此表单提交将发送我想要保存的文件的名称。所有的文件将被提交,但是,现在在服务器端,我们必须将其过滤掉。我还没有为此编写任何代码,但请使用你的想象力。我假设可以通过for循环完成此操作,并匹配从输入字段发送的名称,并将它们匹配到$ _FILES(PHP Superglobal,对不起,我不知道ruby文件变量)变量。

我的观点是你可以在提交之前检查文件。我这样做,然后在他/她提交表单之前将其输出给用户,让他们知道他们正在上传到我的网站。任何不符合标准的内容都不会显示给用户,因此他们应该知道,太大的文件不会被保存。这应该适用于所有浏览器,因为我没有使用FormData对象。

+0

有趣。这个解决方案有什么问题? – delphi 2013-10-07 21:38:09

+10

你不能做到客户端,并期望它始终工作。如果在服务器端检查也很重要,否则人们将使用表单的修改副本(或其他客户端方法)上传超大文件。 服务器端检查就像一个锁,客户端检查就像是一个说“保持”的便笺。 先把门锁上,然后贴上“禁止”标志。 – user340140 2013-10-09 02:49:11

+1

@ user340140只要客户端支持JavaScript,您就可以。如果客户不只是简单说明该网站需要启用JavaScript。 JavaScript有一个文件阅读器,基本上不会被欺骗,它一点一点地读取,因此不用担心接收一个秘密另一个大小的小文件。服务器端是首选的“安全”方法,但我没有看到javascript在谈论文件大小时如何不安全。 – 2013-10-21 17:38:52