因此,我尝试使用分段上传将文件上传到Google云端存储,方法是事先将文件分成块并通过http put请求发送。
问题在于,当我上传文件的最后一块时,我收到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字节块,并使用上传URL通过http使用PUT上传。这不是问题,因为每次上传一个块时,我都会收到308响应,其中包含预期的上传字节数。我可以多次这样做,因为256x1024,将整个文件上传到最后一个块。
以下是最后一个块上的UrlFetchApp选项和标头,例如:
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文件上传完成。我做错了什么?
答案 0 :(得分:4)
回答自己的问题因为这个问题正在解决:
所以这里有两个部分是错误的。
第一个是我最后发送的最后一个文件块是一个字节 短。我一直在使用标题中发送的字节范围 切片字节数组。最后一个字节被遗漏了,因为 这个。
通过调整脚本使得对于最后一个文件块,它会抓取 最后一个尾随字节,我能够获得200 HTTP响应,并且 文件已成功上传。
第二部分错误是API返回空白503,应该是 Service Unavailable个错误。根据云存储文档,您应该在503的情况下尝试exponentially backing off service。API 应一直在抛出4xx文件上传错误,这就是为什么我花了这么长时间才跟踪通过上传来解决这里出了什么问题。
我向Google云端存储团队报告了503错误,他们将在接下来的几个版本中针对其API进行修复。