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

在PHP上,他们有办法在上传之后限制文件大小,但不能在上传之前。 我使用Malsup jQuery表单插件进行表单发布,并支持图像文件发布。

我想知道是否有一个限制,我可以设置多less字节可以通过该AJAXstream到服务器? 这可以让我检查文件的大小,并返回一个错误,如果文件太大。

通过在客户端这样做,它阻止那些从宾得拍摄10MB照片的新手,并尝试上传。

这是从我的答案在一个非常类似的问题的副本: 如何检查与jQuery的文件input大小?


您实际上无法访问文件系统(例如读取和写入本地文件)。 但是,由于HTML5 File 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的检查的所述文件尺寸/


旧的浏览器支持

请注意,旧的浏览器将返回以前的this.files调用为null值,所以访问this.files[0]将引发一个exception,你应该使用它之前检查File API的支持

我不认为这是可能的,除非你使用Flash,ActiveX或Java上传。

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

我试过这种方式,我得到的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库。

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

如果你使用Flash,你甚至可以做一些奇特的js / css来调整上传体验 – 只使用Flash(作为1×1“电影”)来访问它的file uploadfunction。

我发现Apache2(你也许想要检查Apache 1.5)有一个方法来限制这个在上传之前把它放在你的.htaccess文件中:

LimitRequestBody 2097152

这限制了2兆字节(2 * 1024 * 1024)的file upload(如果我做了我的字节math正确)。

注意当你这样做的时候,当你在表单发布或者获取请求时超出这个限制时,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 

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

  $(".jq_fileUploader").change(function () { var fileSize = this.files[0]; var sizeInMb = fileSize.size/1024; var sizeLimit= 1024*10; if (sizeInMb > sizeLimit) { } else { } }); 

就像其他人所说的那样,由于这样的安全模式,仅使用JavaScript是不可能的。

如果你能够,我build议下面的解决scheme之一..其中两个使用闪存组件的客户端validation; 不过,使用Javascript / jQuery进行连线。 两者都工作得很好,可以用于任何服务器端技术。

http://www.uploadify.com/

http://swfupload.org/

无法validation客户端的图像大小,宽度或高度。 您需要将此file upload到服务器上,并使用PHP来validation所有这些信息。 PHP有特殊的function,如: getimagesize()

 list($width, $height, $type, $attr) = getimagesize("img/flag.jpg"); echo "<img src=\"img/flag.jpg\" $attr alt=\"getimagesize() example\" />";