Google app engine 使用Go将文件写入Google应用程序引擎存储似乎有10MB的限制?

Google app engine 使用Go将文件写入Google应用程序引擎存储似乎有10MB的限制?,google-app-engine,go,google-cloud-storage,Google App Engine,Go,Google Cloud Storage,我正在使用将文件写入GAE存储。只要我试图复制的文件大小小于10MB,使用io.Copy就会返回成功的结果。如果文件大于10MB,myio.Copy将成功退出并写入字节数,但在我的存储桶中找不到该文件 我在文档中找不到任何提示,因此希望社区能提供一些关于他们是如何做到这一点的反馈。以下是我的代码片段: func (s *GoogleStorage) StoreReader(r io.ReadCloser) error { defer r.Close() wc := storage.Ne

我正在使用将文件写入GAE存储。只要我试图复制的文件大小小于10MB,使用
io.Copy
就会返回成功的结果。如果文件大于10MB,my
io.Copy
将成功退出并写入字节数,但在我的存储桶中找不到该文件

我在文档中找不到任何提示,因此希望社区能提供一些关于他们是如何做到这一点的反馈。以下是我的代码片段:

func (s *GoogleStorage) StoreReader(r io.ReadCloser) error {
  defer r.Close()

  wc := storage.NewWriter(s.Context, s.Bucket, s.BackupName)
  wc.ContentType = "text/plain"
  wc.ACL = []storage.ACLRule{{storage.AllUsers, storage.RoleReader}}
  defer wc.Close()

  count, err := io.Copy(wc, r)
  if err != nil {
    s.app.Infof("Error doing copy:", err)
  }
  s.app.Infof("Bytes written: %d", count)
  return err
}
我更新了上述代码以返回更多信息:

func (s *GoogleStorage) StoreReader(r io.ReadCloser) error {
  defer r.Close()

  wc := storage.NewWriter(s.Context, s.Bucket, s.BackupName)
  wc.ContentType = "text/plain"
  wc.ACL = []storage.ACLRule{{storage.AllUsers, storage.RoleReader}}

  count, err := io.Copy(wc, r)
  if err != nil {
    s.app.Infof("Error doing copy:", err)
  }
  if err := wc.Close(); err != nil {
    s.app.Infof("ERROR ", err)
  }
  s.app.Infof("updated object:", wc.Object())
  s.app.Infof("Bytes written: %d", count)
  return err
}
这就是我在
wc.Close()之后得到的错误

i16:31:19.729错误%!(额外*url.Error=Posthttps://www.googleapis.com/upload/storage/v1/b/maxr-test/o?alt=json&uploadType=multipart: 呼叫错误5:)
I 16:31:19.729更新对象:%!(额外*storage.Object=)

解决方案之一可能是在云存储中上传/写入文件。使用的优点是,它自动支持可恢复/区块上传,这样您就不会陷入URL获取请求大小超过错误的情况。这是你的电话号码

这是由于谷歌10MB存储空间的限制。 在我的日志中:

com.google.appengine.api.urlfetch.RequestPayloadTooLargeException: The request to https://www.googleapis.com/upload/storage/v1/b/XXXXXXXX exceeded the 10 MiB limit.
这就是我发现的,我正在使用Java库:(
com.google.api.services.storage.storage

在这里,我找到了一个例子,但我的队友仍在对此进行调查

也许这对你有帮助。完成后,我会添加我的结果

嗯。解决了的。 MediaHttpUploader.DEFAULT_CHUNK_大小约为10MB,这已经太大了。低于10MB的所有内容都将被接受

    Storage client = getService();
    Storage.Objects.Insert insertRequest = client.objects().insert(
            BUCKET_NAME, objectMetadata, contentStream);

    //done by adding following two lines:
    //  - chunk is set to <10MB (~5MB in this case)
    //  - directed upload is disabled.
    insertRequest.getMediaHttpUploader().setChunkSize(MediaHttpUploader.DEFAULT_CHUNK_SIZE/2); //set to 5MB
    insertRequest.getMediaHttpUploader().setDirectUploadEnabled(false);

    final StorageObject storageObject = insertRequest.execute();
Storage client=getService();
Storage.Objects.Insert insertRequest=client.Objects().Insert(
BUCKET_名称、objectMetadata、contentStream);
//通过添加以下两行完成:

//-chunk被设置为仅供参考,当通过web界面上载大于10MB的文件时,它会毫无问题地上载。好的,我在wc.Close()上添加了一些错误处理,得到以下错误:error%!(EXTRA*url.Error=Post:callerror 5:)嗯,我发现:~看起来确实有10MB的限制。现在怎么办?有几个想法:(i)如果在
Copy()
returns()之后尝试获取对象的元数据,会发生什么?(ii)当你说文件找不到了,你是想得到物品还是列出桶里的东西(见)嗨,我更新了帖子以反映更多信息,希望能回答你的第一个问题。
    Storage client = getService();
    Storage.Objects.Insert insertRequest = client.objects().insert(
            BUCKET_NAME, objectMetadata, contentStream);

    //done by adding following two lines:
    //  - chunk is set to <10MB (~5MB in this case)
    //  - directed upload is disabled.
    insertRequest.getMediaHttpUploader().setChunkSize(MediaHttpUploader.DEFAULT_CHUNK_SIZE/2); //set to 5MB
    insertRequest.getMediaHttpUploader().setDirectUploadEnabled(false);

    final StorageObject storageObject = insertRequest.execute();