谷歌云存储多部分上传,最后一块失败(503)
Google Cloud Storage Multipart Upload, with Last Chunk Failing (503)
因此,我尝试使用多部分上传将文件上传到谷歌云存储,方法是事先将文件分成块,并通过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文件上传完成。我做错了什么?
回答自己的问题,因为这个问题正在解决:
所以这里有两个部分是错误的。
-
第一个是我最后发送的最后一个文件块是一个字节短的我一直在使用我在标头中发送的字节范围对字节数组进行切片。最后一个字节被遗漏,因为这一点。
通过调整脚本,使得对于最后一个文件块最后一个尾随字节,我得到了200个HTTP响应文件已成功上载。
-
第二部分错误是API返回了空白503,这应该是服务不可用错误。根据云存储文档,在503的情况下,您应该尝试指数级地退出服务。API本应抛出4xx文件上载错误,这就是为什么我花了这么长时间才找到上载错误的原因。
我向谷歌云存储团队报告了503错误,他们将在接下来的几个版本中修复他们的API。
相关文章:
- 当json解析空响应时,Whatwg-Fetch失败,我该如何防止它
- JsFiddle在分叉后描述失败
- 为什么不'当单元测试出现解析错误时,我的因果报应测试会失败
- 当一些承诺失败时,如何继续使用$q.all()
- 失败:等待Protractor与页面同步时出错:“”;在窗口上找不到角度”;
- 在Jquery中单击传播失败
- 网页上失败的javascript会导致所有其他脚本失败
- 带有对象解析的响应javascript ajax失败
- 一台特定计算机的Ajax请求数据未定义/失败
- Nodejs服务器:加载资源失败:服务器的响应状态为404(未找到)
- jQuery.getJSON失败,语法错误
- ng disabled在放入多个表达式时失败
- Jasmine单元测试在监视服务方法时失败
- jQuery分页下一页和上一页按钮在点击零或超过最后一页后失败
- 在iframe的情况下,jQuery html()将失败
- 在我的情况下,使用带有变量失败的 jquery 选择器
- CSS中的转换似乎失败了,原因是什么
- 在数组中插入对象失败
- Backbone fetch中的Ajax在fetch调用退出后完成,因此fetch调用中没有成功/失败事件
- 谷歌云存储多部分上传,最后一块失败(503)