代码之家  ›  专栏  ›  技术社区  ›  RameshVel

上传时检查文件大小的推荐方法

  •  12
  • RameshVel  · 技术社区  · 14 年前

    我正在开发一个支持文件上传的Web应用程序。我已经熟悉在服务器端检查大小,但我想在客户端检查文件大小。

    我知道这是一个浏览器限制,因为安全原因我们不能访问文件属性。所以我尝试了swfupload和uploadify组件。两者都很好,都能满足需求。

    但是限制都取决于flash,所以如果我的最终用户没有安装flash,我最终会遇到一个问题。要求他们安装Flash是另一回事,但它是一个门户网站,用户群庞大。所以我不喜欢让他们安装flash的想法。

    今天我在Gmail中看到了文件上传功能。并在浏览器(IE)中进行了测试,但没有安装Flash。我发现的很有趣。如果你上传了一个大文件,他们会回发一个帖子,然后立即返回消息文件太大。

    如何做到这一点,如何在不下载整个内容的情况下找到文件的大小。?我相信这必须通过读取HTTP头信息来完成。我说的对吗?

    这就是我想要实现的确切功能。如果已经安装了flash,我可以使用uploadify检查大小,否则我可能会实现谷歌使用的Never Heardoff技术。

    有人能推荐我怎么做吗?

    以前有人遇到过类似的问题,你做了什么?

    更新:

    在FF中安装了Flash的Gmail上载

    在IE中没有闪存

    剥削。我已经熟悉在服务器端检查大小,但我想在客户机端检查文件大小。

    我知道这是一个浏览器限制,因为安全原因我们不能访问文件属性。所以我尝试了swfupload和uploadify组件。两者都很好,都能满足需求。

    但是限制都取决于flash,所以如果我的最终用户没有安装flash,我最终会遇到一个问题。要求他们安装Flash是另一回事,但它是一个门户网站,用户群庞大。所以我不喜欢让他们安装flash。

    今天我在Gmail中看到了文件上传功能。并在浏览器(IE)中进行了测试,但没有安装Flash。我发现的很有趣。如果你上传了一个大文件,他们会回发一个帖子,然后立即返回消息文件太大。

    如何做到这一点,如何在不下载整个内容的情况下找到文件的大小。?我相信这必须通过读取HTTP头信息来完成。我说的对吗?

    这就是我想要实现的确切功能。如果已经安装了flash,我可以使用uploadify检查大小,否则我可能会实现谷歌使用的Never Heardoff技术。

    有人能推荐我怎么做吗?

    以前有人遇到过类似的问题,你做了什么??

    更新:

    在FF中安装了Flash的Gmail上载

    alt text

    在IE中没有闪存

    10 回复  |  直到 14 年前
        1
  •  6
  •   Darin Dimitrov    14 年前

    你可以看看 File API 这是HTML 5的草稿。这里有一个 nice article . 就是这样 Gmail uses 当然,如果浏览器支持的话。但是没有办法确保它在所有浏览器中都能正常工作。

        2
  •  5
  •   Service Informatique    14 年前

    在IE中,你可以做到 with JS and ActiveX :

    function A()
    {
      var oas = new ActiveXObject("Scripting.FileSystemObject");
      var d = document.a.b.value;
      var e = oas.getFile(d);
      var f = e.size;
      alert(f + " bytes");
    }
    
    </script>
    </head>
    <body>
    <form name="a">
    <input type="file" name="b">
    <input type="button" name="c" value="SIZE" onClick="A();">
    </form>
    </body>
    </html>
    
        3
  •  2
  •   Community CDub    8 年前

    事实上,几天前我问了这个问题(或多或少),总的来说,答案似乎是:做不到。

    供参考: Ensure file size of uploaded file is lower than maxRequestLength before the upload occurs?

        4
  •  1
  •   Jeff Knecht    14 年前

    我还没有测试过这个,但是请求中没有“内容长度”标题吗?它将不仅仅包括正在上传的文件,但是您可以使用它作为基准来确定文章是否太大而无法处理。

        5
  •  1
  •   PlagueEditor    14 年前

    首先我要说的是,我还不能生成一个工作副本,而这大部分是我从阅读和轻微的过期中理解的。也就是说,如果我错了,也许你可以多探索一点,或者让我直截了当。 主要内容是指出了经典表单的思想,其中隐藏了一个名为max_file_size的输入…在php/apache中,如果上载大于最大文件大小,服务器将停止(参见 here )在php方面,$文件数组将返回一个错误代码(可以看到 here )注意 上传表格大小 .

    要将这些放在一起,可以让javascript在iframe中上载文件并获得结果。如果服务器发出一条错误消息(在这个理论中,这条消息很快就会出现),javascript就可以简单地提醒用户。否则,我们可以假设文件现在已成功上载。现在,试图理解谷歌的代码几乎是不可能的;快速的HTML扫描就我而言,它没有任何帮助…它们确实有隐藏的输入字段,但没有以max_file_size作为名称的输入字段。它们要短得多,而且大多数似乎没有价值。但是,我相信这是可能的。有人想吗?

    谁知道呢,也许这台伟大的谷歌网络服务器内置了即时切断上传的功能。谢谢你的聆听!

        6
  •  1
  •   Simon Mourier    14 年前

    我相信文件上传是基于 RFC 1867 尽管HTML5取代了这一切。您可以完美地重新实现这个RFC,服务器端,并检查累积的传入流的大小。

    在大多数情况下,我认为您不能安全地依赖内容长度,因为它可能不代表文件的大小,而只是块的大小。

        7
  •  1
  •   RameshVel    14 年前

    经过大量的搜索,我发现我们可以使用 maxAllowedContentLength 限制ASP.NET应用程序中的上载大小。请记住,此设置仅适用于IIS 7或更高版本。

    因为这是在IIS级别处理的,所以我们不需要在服务器代码中处理任何内容。如果大小限制超过,它将返回错误代码 四百零四点一三 . 所以您可以很容易地在客户端检查代码以确定问题。

    这是我所做的处理大型文件的工作,如果闪存没有安装在客户机上。

    希望这能帮助别人。

    有关此设置的详细信息,请阅读 this

        8
  •  1
  •   Spiderman    14 年前

    可以确定正在上载的文件的大小,即使在上载的文件完全传输之前也是如此。即使使用Internet Explorer。通过使用HTTP的内容长度头!
    在Java世界中:
    首先,如果您在使用第一个servlet/filter/controller之前处理到达服务器的请求,那么您可以在 内容长度标题 (请求.getContentLength())。

    第二,看看Ajax实现,它证明了这是可能的: http://www.ajaxfilebrowser.com/

        9
  •  1
  •   Niraj Choubey    14 年前

    您可以使用以下代码获取gmail功能:

    <html>
    <head>
    <script type="text/javascript">
    $(function()
    {
    
    $('#btnSubmit').click(function()
    {
    if (typeof (input.files) != 'undefined') {  // this will work in firefox,chrome.
       if (input.files[0].fileSize > MAX_FILE_SIZE) {
            alert("file size exceeded");
             return false;
          }
     }
    else
    {
    //this approach will work for ie 8.
    $('iframe').bind('load'),function()
    {
    try
    {
    var text = $('iframe')[0].contentWindow.document.body ? $('iframe')[0].contentWindow.document.body.innerHTML : null;
    }
    catch(e)
    {
    alert('Server error occurred');
    }
    }
    });
    });
    
    });
    </script>
    </head>
    <body>
    <form method="post" enctype="multipart/form-data" name="fileUpload" action="Default.aspx" target="responseFrame">
    <input type="file"/>
    <input type="submit" value="upload" id="btnSubmit"/>
    </form>
    <iframe src='' name='responseFrame' id='responseFrame' style='width:0px;height:0px;border:0;'></iframe>
    </body>
    </html>
    

    希望这有帮助。

        10
  •  0
  •   Breezer    14 年前

    LOL OFC你可以做到,如果你搜索“上传栏快闪”,那就有点辛苦了。 您可以使用它来传递、比较或执行您想要的任何操作,而不是使用您检索的数据来创建上载程序。 我发现这个看起来很不错,它不需要用闪光灯 但你可以用它来完成同样的事情 http://www.plupload.com 高度可配置 另外,如果你真的喜欢的话,你可以强迫它使用flash。