javascript - Google Cloud Storage 分段上传,最后一个 block 失败 (503)

标签 javascript google-apps-script google-cloud-storage urlfetch

所以我尝试使用分段上传将文件上传到谷歌云存储,方法是预先将文件分成 block 并通过 http put 请求发送。

问题是当我上传文件的最后一 block 时,我收到了 503 错误,而不是 200 条完整消息。

为简单起见,我使用来自驱动器的 jpeg 图像,先转换为 blob,然后再转换为字节:

var data = DriveApp.getFileById(DriveImageFileId).getBlob().getBytes();

根据文档,我首先请求一个可重复的上传 URI。

  var accessToken = OAuth2.0_Access_Token;
  var header = {'X-Upload-Content-Type' : 'image/jpeg'}
  var body = {"name": "filename.jpeg"}  
  var options = {
    'method':'post',
    'contentType':'application/json',
    'oAuthUseToken':'never',  // Disables OAuth1.0 config 
    'muteHttpExceptions':true,
    'headers':header,
    'contentLength': 582381,
    'payload':JSON.stringify(body)
  };

  var response = UrlFetchApp.fetch('https://www.googleapis.com/upload/storage/v1beta2/b/myCloudStoreBucket/o?uploadType=resumable&access_token='+accessToken,options).getHeaders();
  var uploadUrl = response.Location 

这很好用。

我开始将文件字节解析为 256x1024 字节 block ,并使用上传 URL 通过 http 使用 PUT 上传。这不是问题,因为每次我上传一个 block 时,我都会收到一个 308 响应,其中包含预期的上传字节数。我可以多次执行此操作,以 256x1024 为单位上传整个文件,直到最后一个 block 。

这是最后一 block 上的 UrlFetchApp 选项和 header ,例如:

 var options = {
 "method": "put",
 "contentType": "image/jpeg",
 "contentLength": 58093,
 "oAuthUseToken": "never",
 "muteHttpExceptions": true,
 "headers": {
  "Content-Range": "bytes 524287-582380/582381"
 },
 "payload" : <dataBytes>
 }
 var response = UrlFetchApp.fetch(resumeUrl,options);

返回以下内容:

 Response Type: 503
 Response Header:
 {
 "Date": "Wed, 16 Apr 2014 06:08:43 GMT",
 "Content-Length": "0",
 "Alternate-Protocol": "443:quic",
 "Content-Type": "text/html; charset=UTF-8",
 "Server": "HTTP Upload Server Built on Apr 7 2014 11:59:06 (1396897146)"
 }
No Response body or error message.

响应应该是 200 文件上传完成。我做错了什么?

最佳答案

回答自己的问题,因为这正在解决:

所以这里有两处是错误的。

  1. 首先是我最后发送的最后一个文件 block 是一个字节 短的。我一直在使用我在标题中发送的字节范围 切片字节数组。错过了最后一个字节,因为

    通过调整脚本,使其抓取最后一个文件 block 最后一个尾随字节,我能够得到 200 HTTP 响应,并且 文件上传成功。

  2. 第二部分错误是 API 返回空白 503,这应该是 Service Unavailable错误。根据云存储文档,您应该尝试 exponentially backing off service在 503 的情况下。API 应该一直抛出 4xx 文件上传错误,这就是为什么我花了这么长时间才找出上传的问题所在。

我向 Google Cloud Storage 团队报告了 503 错误,他们将在接下来的几个 API 版本中修复。

关于javascript - Google Cloud Storage 分段上传,最后一个 block 失败 (503),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23101485/

相关文章:

javascript - 按时间顺序对带有日期的多维数组进行排序的最快方法

javascript - jQuery 选项卡 : how to create a link to a specific tab?

google-apps-script - 仅修改 Google 表格图表中的一个系列

javascript - 更新到 Node 10-alpine 后 - ERR_STREAM_CANNOT_PIPE

javascript - 我如何获得一个只有时间的 moment.js 日期对象?

javascript - 从 javascript 对象数组中选择特定项目

google-apps-script - 在 replaceText() 中格式化

google-apps-script - 如何下载(导出)应用程序脚本附加项目?

node.js - 如何使用签名网址将文件上传到谷歌云存储桶

google-app-engine - 具有自定义域的云存储上的 SSL