使用 jQuery,在上传前限制文件大小

IT技术 javascript jquery image jquery-plugins upload
2021-01-15 09:48:32

在 PHP 上,他们有一种方法可以在上传后限制文件大小,而不是在上传之前。我使用Malsup jQuery Form Plugin进行表单发布,它支持图像文件发布。

我想知道是否有限制,我可以设置多少字节可以通过该 AJAX 流传递到服务器?这可以让我检查文件大小并在文件太大时返回错误。

通过在客户端执行此操作,它会阻止那些从宾得拍摄 10MB 照片并尝试上传照片的新手。

6个回答

这是我在一个非常相似的问题中的回答的副本:How to check file input size with jQuery?


您实际上无权访问文件系统(例如读取和写入本地文件)。但是,由于 HTML5 文件 API 规范,您确实可以访问一些文件属性,文件大小就是其中之一。

对于此 HTML:

<input type="file" id="myFile" />

尝试以下操作:

//binds to onchange event of your input field
$('#myFile').bind('change', function() {
  //this.files[0].size gets the size of your file.
  alert(this.files[0].size);
});

由于它是 HTML5 规范的一部分,因此它仅适用于现代浏览器(IE 需要 v10),我在此处添加有关您应该了解的其他文件信息的更多详细信息和链接:http : //felipe.sabino.me/javascript /2012/01/30/javascipt-checking-the-file-size/


旧浏览器支持

请注意,旧浏览器会null为前一次this.files调用返回一个,因此访问this.files[0]会引发异常,您应该在使用前检查文件 API 支持

@ShawnEary 这不是一个技巧,它只是 HTML5 文件 API 实现,IE10 确实支持caniuse.com/#feat=fileapi :)
2021-04-08 09:48:32

除非您使用 flash、activex 或 java 上传器,否则我认为这是不可能的。

出于安全原因,ajax/javascript 不允许在上传之前或期间访问文件流或文件属性。

在您撰写此答案时,这实际上是正确的,但我们现在在 HTML5 新规范中有一个文件 API :) stackoverflow.com/a/9106313/429521
2021-03-14 09:48:32

我以这种方式尝试过,结果在 IE* 和 Mozilla 3.6.16 中得到了结果,但没有检查旧版本。

<img id="myImage" src="" style="display:none;"><br>
<button onclick="findSize();">Image Size</button>
<input type="file" id="loadfile" />
<input type="button" value="find size" onclick="findSize()" />
<script type="text/javascript">
function findSize() {
    if ( $.browser.msie ) {
       var a = document.getElementById('loadfile').value;
           $('#myImage').attr('src',a);
           var imgbytes = document.getElementById('myImage').size;
           var imgkbytes = Math.round(parseInt(imgbytes)/1024);
           alert(imgkbytes+' KB');
    }else {
           var fileInput = $("#loadfile")[0];
           var imgbytes = fileInput.files[0].fileSize; // Size returned in bytes.
           var imgkbytes = Math.round(parseInt(imgbytes)/1024);
                   alert(imgkbytes+' KB');
     }
}    
</script>

还要添加 Jquery 库。

首先,感谢您的代码。其次,我的代码位于此处:jsfiddle.net/6ZQkj/2它在 Mac 上的 Chrome、Firefox 或 Safari 中不起作用,欢迎提供任何见解
2021-04-08 09:48:32

我遇到了同样的问题。您必须使用 ActiveX 或 Flash(或 Java)。好处是它不必是侵入性的。我有一个简单的 ActiveX 方法,它将返回要上传的文件的大小。

如果你使用 Flash,你甚至可以做一些花哨的 js/css 来自定义上传体验——只使用 Flash(作为 1x1“电影”)来访问它的文件上传功能。

我们使用 SWFUpload,虽然没有在积极的开发中,但它已被证明非常方便且易于集成
2021-04-05 09:48:32
这似乎是要走的路,我很确定 Flickr 使用 Flash 控件来提供一些关于您上传内容的反馈,如果它太大并且它的进展。
2021-04-07 09:48:32

我发现 Apache2(您可能还想检查 Apache 1.5)有一种方法可以在上传之前通过将其放入您的 .htaccess 文件中来限制它:

限制请求正文 2097152

这将文件上传限制为 2 兆字节(2 * 1024 * 1024)(如果我正确地进行了字节计算)。

请注意,当您执行此操作时,当您在表单发布或获取请求上超出此限制时,Apache 错误日志将生成此条目:

Requested content-length of 4000107 is larger than the configured limit of 2097152

它还会在 Web 浏览器中显示此消息:

<h1>Request Entity Too Large</h1>

因此,如果您正在使用 Malsup jQuery Form Plugin 之类的东西进行 AJAX 表单发布,您可能会捕获像这样的 H1 响应并显示错误结果。

顺便说一下,返回的错误号是 413。所以,你可以在你的 .htaccess 文件中使用一个指令,比如......

Redirect 413 413.html

...并提供更优雅的错误结果。

是的,但是用户仍然必须等待他们的 30MB 文件上传才能收到错误。如果您使用 flash/activeX,您甚至可以在他们提交页面之前警告他们。
2021-04-07 09:48:32