建议在上传时检查文件大小的方法

时间:2010-11-17 12:18:21

标签: c# http file-upload web http-headers

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

我知道它的浏览器限制,出于安全原因我们无法访问文件属性。所以我尝试了swfupload和uploadify组件。两者都很好并满足需求。

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

今天我遇到了gmail中的文件上传功能。并且在没有安装闪存的情况下在浏览器(IE)中进行了测试我发现的很有趣。如果您上传了一个大文件,他们会进行回发并立即返回文件大小过大的消息。

如何实现,如何在不下载整个内容的情况下找到文件的大小。我相信这必须通过阅读HTTP标头信息来完成。我是对的吗?

所以这是我想要实现的确切功能。如果已经安装了闪存,我可以使用uploadify来检查大小,否则可能是我将实现 - 从未听过的技术 - 谷歌使用。

有人可以推荐我怎么做吗?

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

更新

使用FF安装的Flash上​​传Gmail

alt text

IE中没有flash

alt text

10 个答案:

答案 0 :(得分:6)

您可以查看File API这是HTML 5的草稿。这是一个nice article。如果浏览器支持它,那就是Gmail uses。但是没有办法确保这适用于所有浏览器。

答案 1 :(得分:5)

在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>

答案 2 :(得分:2)

几天前我实际上问了这个问题(或多或少),一般的答案似乎是:它无法完成。

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

答案 3 :(得分:1)

我没有对此进行测试,但请求中是否没有“内容长度”标题?它不仅包括上传的文件,还可以将其用作基准来确定POST是否太大而无法处理。

答案 4 :(得分:1)

我首先要说的是,我无法生成一份工作副本,而且大部分内容都是我从阅读中获得的理解和轻微的经验。也就是说,如果我错了,也许你可以更多地探索它和/或让我直截了当。    主要指向经典表单的概念,其中隐藏的输入名为MAX_FILE_SIZE ...在PHP / Apache中,如果上载大于MAX_FILE_SIZE,服务器将停止(参见here的最后一篇文章)。在PHP方面,$ _FILES数组将返回一个错误代码(可以看到here)。记下 UPLOAD_ERR_FORM_SIZE

将这些放在一起,您可以让JavaScript在IFrame中上传文件并获得结果。如果服务器发出错误消息(在理论上,这将非常快),JavaScript可以简单地提醒用户。否则,我们可以假设该文件现已成功上传。现在试图理解谷歌的代码几乎是不可能的;一个快速的HTML扫描是我去的,它没有任何帮助...他们确实有隐藏的输入字段,但没有MAX_FILE_SIZE作为名称。它们更短,大多数似乎没有价值。但是,我相信这是可能的。想什么?

谁知道,也许伟大的Google Web Server内置了能够立即切断上传的功能。谢谢你的聆听!

答案 5 :(得分:1)

我认为文件上传基于RFC 1867,尽管HTML5取代了所有这些。您可以完美地重新实现此RFC,服务器端,并检查累积的传入流的大小。

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

答案 6 :(得分:1)

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

由于这是在IIS级别处理的,因此我们不需要处理服务器代码中的任何内容。如果尺寸限制超出,则会返回错误代码 404.13 。因此,您可以轻松检查客户端的代码以确定问题。

如果客户端计算机上没有安装闪存,我就可以处理大文件。

希望这可能有助于某人。

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

答案 7 :(得分:1)

可以确定即使在上传文件完全传输之前上传的文件的大小。即使使用Internet Explorer也是如此。通过使用HTTP的内容长度标头!
在java世界中:
首先,如果您处理在第一个servlet /过滤器/控制器中的任何先前线程质量之前到达服务器的请求,您将获得 content-length头中的总文件大小(request.getContentLength())。

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

答案 8 :(得分:1)

您可以使用以下代码获取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>

希望得到这个帮助。

答案 9 :(得分:0)

大声笑,你可以做到这一点,如果你搜索“uploadbar flash”,那只是有点辛苦了 而不是使用您检索的数据来创建上传器,您可以使用它来传递或比较或做任何你想要的 我发现这个看起来相当不错的是它,它不会使用闪光灯 但你可以用它来实现同样的目的 http://www.plupload.com 高度可配置 附:如果你真的喜欢,你可以强迫它使用闪光灯