【问题标题】:Using jQuery, Restricting File Size Before Uploading使用 jQuery,在上传前限制文件大小
【发布时间】:2010-09-23 09:19:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript jquery image jquery-plugins upload


    【解决方案1】:

    这是我在一个非常相似的问题中的答案的副本: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),我添加了here 更多详细信息以及您应该知道的其他文件信息的链接:http://felipe.sabino.me/javascript/2012/01/30/javascipt-checking-the-file-size/


    旧浏览器支持

    请注意,旧浏览器将为之前的 this.files 调用返回一个 null 值,因此访问 this.files[0] 会引发异常,您应该在使用它之前 check for File API support

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    我尝试过这种方式,我在 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 中不起作用,欢迎任何见解
    【解决方案4】:

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

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

    【讨论】:

    • 这似乎是可行的方法,我很确定 Flickr 使用 Flash 控件来提供一些关于您上传内容的反馈,如果它太大并且它是进度。
    • 我们使用 SWFUpload,虽然没有积极开发,但事实证明它非常方便且易于集成
    【解决方案5】:

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

    LimitRequestBody 2097152

    这会将文件上传时的大小限制为 2 兆字节 (2 * 1024 * 1024)(如果我正确地进行了字节数学运算)。

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

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

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

    <h1>Request Entity Too Large</h1>
    

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

    顺便说一句,返回的错误号是 413。因此,您可以在 .htaccess 文件中使用指令,例如...

    Redirect 413 413.html
    

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

    【讨论】:

    • 是的,但用户仍然必须等待上传 30MB 的文件才能收到错误消息。如果您使用 flash/activeX,您甚至可以在他们提交页面之前警告他们。
    【解决方案6】:
     $(".jq_fileUploader").change(function () {
        var fileSize = this.files[0];
        var sizeInMb = fileSize.size/1024;
        var sizeLimit= 1024*10;
        if (sizeInMb > sizeLimit) {
    
    
        }
        else {
    
    
        }
      });
    

    【讨论】:

    • 这个问题比较老了,你有足够的时间来做出一个好的描述性答案,即请在你的代码中添加一些解释。
    • 我认为它不适用于 IE 9,文件对象没有 size 属性。
    【解决方案7】:

    正如其他人所说,由于 JavaScript 的安全模型,仅使用 JavaScript 是不可能的。

    如果可以,我会推荐以下解决方案之一。它们都使用 Flash 组件进行客户端验证;但是,使用 Javascript/jQuery 进行连接。两者都工作得很好,可以与任何服务器端技术一起使用。

    http://www.uploadify.com/

    http://swfupload.org/

    【讨论】:

      【解决方案8】:

      试试下面的代码:

      var sizeInKB = input.files[0].size/1024; //Normally files are in bytes but for KB divide by 1024 and so on
      var sizeLimit= 30;
      
      if (sizeInKB >= sizeLimit) {
          alert("Max file size 30KB");
          return false;
      }
      

      【讨论】:

        【解决方案9】:

        无法在客户端验证图像大小、宽度或高度。您需要将此文件上传到服务器并使用 PHP 来验证所有这些信息。 PHP 具有特殊功能,例如:getimagesize()

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-16
          • 1970-01-01
          • 2015-07-02
          • 2011-01-29
          • 2017-03-09
          • 2011-01-13
          • 1970-01-01
          • 2022-10-26
          相关资源
          最近更新 更多