限制文件上传的大小(html输入)

del*_*phi 57 html

我想简单地限制用户可以上传的文件的大小.

我认为maxlength = 20000 = 20k但这似乎根本不起作用.

我正在运行Rails,而不是PHP,但是我认为在HTML/CSS中做客户端更简单,或者使用jQuery作为最后的手段.这是非常基本的,但必须有一些我遗漏或不知道的HTML标记.

希望支持IE7 +,Chrome,FF3.6 +.我想如果有必要,我可以支持IE8 +.

谢谢.

mar*_*man 81

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

我使用jQuery来选择输入元素.我设置了一个on change事件.

$("#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);

});
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你无法做客户端,并希望它始终有效.如果重要的是检查服务器端,否则人们将使用表单的修改副本(或其他客户端方式)来上传超大文件.服务器端检查就像一个锁,客户端检查就像一个说"禁止"的便利贴.首先锁上门,然后竖起"禁止"标志. (16认同)
  • 因为像user340140一样,无论你做什么,Javascript都可以轻松修改.您可以在服务器端检查可用性,但无法使用客户端Javascript保护它. (5认同)
  • 虽然服务器端应该始终执行最终验证,但在客户端执行此操作也将限制任何不希望绕过检查并启用 Javascript 的人的错误上传数量 - 这通常代表大量用户,如果您正在实现面向用户和服务器部分。 (3认同)
  • @user340140 只要客户端支持 javascript 就可以。如果客户端不只是简单地声明该站点需要启用 javascript。Javascript 有一个基本上无法被欺骗的文件阅读器,它会一点一点地读取,所以不用担心收到一个秘密的另一个大小的小文件。服务器端是首选的“安全”方法,但我不知道在谈论文件大小时 javascript 是如何安全的。 (2认同)

Has*_*man 48

var uploadField = document.getElementById("file");

uploadField.onchange = function() {
    if(this.files[0].size > 2097152){
       alert("File is too big!");
       this.value = "";
    };
};
Run Code Online (Sandbox Code Playgroud)

这个例子应该可以正常工作 我将其设置为大约2MB,1MB的字节数为1,048,576,因此您可以将其乘以所需的限制.

以下是更加清晰的jsfiddle示例:https://jsfiddle.net/7bjfr/808/

  • @AkshayAnurag,您只能在上传整个图像后在后端检查图像大小,如果这是一个巨大的图像,比如说 16mb 并且客户端的连接速度很慢,那么用户必须在图像上传的整个过程中等待才能获得错误在最后。为了防止类似的情况,您需要在前端进行某种验证。如果我错了或遗漏了什么,请告诉我,或者您有什么办法可以防止这种情况发生? (18认同)
  • @AkshayAnurag 客户端验证可防止浪费客户端时间和服务器带宽,这与安全无关,与用户体验有关 (13认同)
  • @AkshayAnurag如果“_有更好的方法_”,你应该发布你自己的答案。 (13认同)

Ort*_*iga 22

你不能在客户端做到这一点.你必须在服务器上这样做.

编辑:这个答案已经过时了!

在编辑时,所有主流浏览器都支持 HTML文件API .

我会提供解决方案的更新,但@ mark.inman.winning 已经做到了.

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

  • 是的,现在不可能.HTML5中有一些新文件api的草稿,但目前还没有浏览器完全支持它. (2认同)
  • 请参阅:http://www.cs.tut.fi/~jkorpela/forms/file.html,"设置文件大小限制",关于为什么尝试在客户端执行此操作毫无意义. (2认同)
  • 有趣......这似乎有用:http://www.plupload.com/.唯一的问题是没有闪存,银光,齿轮等插件的IE8似乎默认为HTML4. (2认同)

小智 7

const input = document.getElementById('input')

input.addEventListener('change', (event) => {
  const target = event.target
  	if (target.files && target.files[0]) {

      /*Maximum allowed size in bytes
        5MB Example
        Change first operand(multiplier) for your needs*/
      const maxAllowedSize = 5 * 1024 * 1024;
      if (target.files[0].size > maxAllowedSize) {
      	// Here you can ask your users to load correct file
       	target.value = ''
      }
  }
})
Run Code Online (Sandbox Code Playgroud)
<input type="file" id="input" />
Run Code Online (Sandbox Code Playgroud)

如果您需要验证文件类型,请写在下面的评论中,我将分享我的解决方案。

(剧透:accept属性不是防弹解决方案)

  • 浏览器可以使用 target.setCustomValidity('Exceeds file size of 5mb'); 通知用户已超出文件限制。目标.reportValidity(); 不要忘记重置 target.setCustomValidity(''); 如果一切都有效的话。文档:https://developer.mozilla.org/en-US/docs/Web/API/HTMLObjectElement/setCustomValidity (3认同)

小智 5

const input = document.getElementById('input')

input.addEventListener('change', (event) => {
  const target = event.target
  	if (target.files && target.files[0]) {

      /*Maximum allowed size in bytes
        5MB Example
        Change first operand(multiplier) for your needs*/
      const maxAllowedSize = 5 * 1024 * 1024;
      if (target.files[0].size > maxAllowedSize) {
      	// Here you can ask your users to load correct file
       	target.value = ''
      }
  }
})
Run Code Online (Sandbox Code Playgroud)
<input type="file" id="input" />
Run Code Online (Sandbox Code Playgroud)