任何方式从网址获取文件大小而不使用谷歌应用程序脚本下载它。

时间:2017-11-28 16:37:07

标签: javascript google-apps-script

实际上我不知道如何提出头部请求和阅读内容长度。 我试着写这个函数:

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的值。 任何人都可以提出另一种更快的做法 使用谷歌应用程序脚本?

2 个答案:

答案 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)个字节。