JavaScript 检查文件大小

6

是否有可能使用JavaScript定期检查Web服务器上文件(例如http://www.mysite.com/myfile.js)的文件大小是否大于0字节,如果是,则返回true或false值?

谢谢!


你需要一个简单的ajax请求和一个服务器端点,该端点返回所请求文件的大小...如果没有这些,默认情况下将无法实现。 - sra
@sra:这并不一定是真的(https://dev59.com/xFzUa4cB1Zd3GeqP45_b#7909914)。 - josh3736
4个回答

12
理论上,您可以使用XHR发出HTTP HEAD请求并检查响应标头中的Content-LengthHEAD请求与常规GET请求相同,除了服务器不能返回实际内容。换句话说,服务器会回复它将要发送给你的资源的标头,但随后停止,不发送文件。
然而,一些服务器HEAD请求的响应是0Content-Length标头,无论文件的实际大小如何。其他服务器会响应文件的大小。
为了实现这一点,您必须祈求服务器将文件的实际大小返回给HEAD请求。
如果是这样,获取该值很容易
$.ajax('/myfile.js', {
    type: 'HEAD',
    success: function(d,r,xhr) {
       fileSize = xhr.getResponseHeader('Content-Length');
    }
});

请注意,当我们执行HEAD /时,JSFiddle的服务器始终返回0,即使/16916字节。
还要注意jQuery的文档中关于HTTP请求类型选项的说明:

要发出的请求类型(“POST”或“GET”),默认为“GET”。注意:其他HTTP请求方法,如PUT和DELETE,在此处也可以使用,但并非所有浏览器都支持。

我刚在IE 6-10、Firefox 3.6-7、Opera 9-11和Chrome中测试了这个Fiddle,每个浏览器都正确发出了HEAD请求,所以我不会担心那个模糊的不兼容性声明。更令人担忧的是你的服务器如何响应。

2
很抱歉,Javascript无法访问文件系统(幸好),所以恐怕不行。

1
+1 如果在浏览器中运行,则不需要多说。但是我认为值得一提的是,如果JS在浏览器外部运行,这可能不正确,因为规范允许进行文件系统活动。 - sra
抱歉,我认为我没有表达清楚。我想要检查网络上文件的文件大小。我已经编辑了问题,希望现在更清晰,并且这是可能的吗? - Ben Paton
@sra的评论对你实际问题的回答是我认为在这种情况下最好的答案。 - Clive

0

josh3736提出的想法很好。只是他给出的代码示例在我的浏览器(Chrome 20,Firefox 13,IE 8,Opera 12)中无法工作,原因我不知道。

这是一个在我的情况下完美运行的代码示例:

jQuery.ajax
({
    cache: false,
    type: 'HEAD',
    url: 'myfile.js',
    success: function(d,r,xhr){alert('File size is ' + xhr.getResponseHeader('Content-Length') + ' bytes.')},
    error: function(xhr, desc, er){alert('ERROR: "' + xhr.responseText + '"')}
});

我还想提醒一下,XAMPP服务器上的Apache与HEAD请求完全正常工作,但当在本地主机上运行时,浏览器会阻止此类请求,并显示错误信息:"Origin localhost is not allowed by Access-Control-Allow-Origin"(来自Chrome的示例)。

-2

如果您将IE的“文档模式”设置为“标准”,则可以使用简单的JavaScript“size”方法来获取上传文件的大小。

将IE的“文档模式”设置为“标准”:

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

然后,使用“size”JavaScript方法获取上传文件的大小:
<script type="text/javascript">
    var uploadedFile = document.getElementById('imageUpload');
    var fileSize = uploadedFile.files[0].size;
    alert(fileSize); 
</script>

其他浏览器: 在所有其他浏览器中,您可以毫无问题地使用JavaScript的“size”方法。


无论您添加了什么元标记,这在IE9或更早版本中都不起作用。 - Ray Nicholus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接