所以我尝试使用多部分上传将文件上传到谷歌云存储,方法是事先将文件分成块,然后通过http put请求发送。
问题是,当我上传文件的最后一个块时,我得到的是503错误,而不是200完整的消息。
为了简单起见,我使用的是驱动器中的jpeg图像,将其转换为blob和bytes:
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应该用于处理不可用的错误。根据云存储文档,在503的情况下,您应该尝试指数级退避服务。API本应该抛出4xx文件上传错误,这就是为什么我花了这么长时间才找到上传的错误所在。
我向Google云存储团队报告了503的bug,他们将在接下来的几个版本中为他们的API找到一个解决方案。
我有一个firebase帐户,我想以编程方式上传一些照片到firebase存储。为此,我使用了google cloud java storage API。我配置权限和其他权限。我可以成功地创建桶,斑点。然而,当我试图上传一张图片时,要么它的大小为0,要么它无法下载(不生成URL)。下面是我使用的代码; 任何建议都很感激。问候。
谷歌云存储中的文件更改需要多长时间才能传播? 我遇到了一个非常令人沮丧的问题,我改变了一个文件的内容,并通过gsutil重新上传,但是这个改变几个小时后才显示出来。有没有办法强制一个改变的文件立即传播所有内容? 如果我查看谷歌云存储控制台中的文件,它会看到新文件,但如果我点击公共网址,它是旧版本,在某些情况下,是2个版本前的版本。 有没有我没有设置的标题? 编辑: 我尝试了,但它没有帮助,但也许旧
我被添加了谷歌云依赖项 但我的生成失败,出现以下错误 我尝试禁用批注处理器 我收到以下错误
我在本地开发服务器上运行代码,但使用在项目上配置的GCS默认桶名。 Python 2.7版
好吧,我有一个使用AmazonS3 multipart的应用程序,它们使用CreateMultipart,UploadPart和CompleteMultiPart。 现在我们正在迁移到谷歌云存储,而我们在MultiPart上遇到了一个问题。据我所知,谷歌不支持s3多部分,从这里得到了谷歌云存储支持s3多部分上传的信息。 所以我看到google有最接近的方法Compose https://cloud
我面临这个问题,当我想上传一个应用程序在谷歌播放商店:- 上传失败您上传了带有无效证书的APK或Android应用程序包。您需要使用当前有效的证书签署您的APK或Android应用程序捆绑包。了解更多关于签名的信息。 恳求帮助不:我通过改变pc的日期来解决