当前位置: 首页 > 知识库问答 >
问题:

Google云存储多部分上传,最后一个块失败(503)

秦永望
2023-03-14

所以我尝试使用多部分上传将文件上传到谷歌云存储,方法是事先将文件分成块,然后通过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个文件上传完成。我做错了什么?

共有1个答案

秦昊穹
2023-03-14

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

所以这里有两个部分是错的。

>

  • 第一个是我最后发送的最后一个文件块短了一个字节。我一直在使用我在头中发送的字节范围来对字节数组进行切片。最后一个字节因此而丢失。

    通过调整脚本,使最后一个文件块抓住最后一个尾随字节,我能够得到一个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的日期来解决