实际上我不知道如何提出头部请求和阅读内容长度。 我试着写这个函数:
function getfilesize(url) {
var msg = '';
var response;
try {
response = UrlFetchApp.fetch(url, {
// muteHttpExceptions: true,
// validateHttpsCertificates: false,
followRedirects: true // Default is true anyway.
});
catch(e) {
return e.toString();
}
var headers = response.getHeaders();
var content_length = NaN;
for (var key in headers) {
if (key.toLowerCase() == 'Content-Length'.toLowerCase()) {
content_length = parseInt(headers[key], 10);
break;
}
}
return content length;
}
但它会在1.81619173E8
中为173mb
返回60 sec
的值。
任何人都可以提出另一种更快的做法
使用谷歌应用程序脚本?
答案 0 :(得分:3)
您的代码可能是正确的。 1.81619173E8
为1816191730字节,即173MB。 Content-Length
始终以字节为单位。
要将其转换为MB,只需将1024除以两次(一次将其放入KB,再次将其换成MB)。
content_length = parseInt(headers[key], 10) / 1024 / 1024;
要更改请求类型,fetch()
似乎不会直接接受HEAD
,但您可以使用X-HTTP-Method
标头覆盖它:
response = UrlFetchApp.fetch(url, {
method: 'GET',
headers: {'X-HTTP-Method-Override': 'HEAD'},
followRedirects: true // Default is true anyway.
});
这应该让它使用HEAD而不是GET。
答案 1 :(得分:0)
我认为这需要很长时间,因为您实际上是在下载内容。
我发现在我的情况下,我可以使用Range
标头请求0个字节,然后检查保存文件大小的响应标头:
var params = {
method: "GET",
headers: {
Range: "bytes=0-0",
},
};
var response = UrlFetchApp.fetch(fileUrl,params);
var headers = response.getHeaders();
var fileSizeString = headers['Content-Range']
var fileSize = +headers['Content-Range'].split("/")[1];
响应标头具有Content-Range=bytes 0-0/139046553
作为值,然后我可以使用它转换为整数(139046553)个字节。