使用Go将文件写入Google App Engine Storage似乎有10MB的限制?

时间:2015-03-04 23:51:31

标签: google-app-engine go google-cloud-storage

我正在使用http://godoc.org/google.golang.org/cloud/storage#Writer将文件写入GAE Storage。只要我尝试复制的文件大小小于10MB,使用io.Copy就会返回成功的结果。如果文件大于10MB,我的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()

之后得到的错误
    I 16:31:19.729 ERROR %!(EXTRA *url.Error=Post https://www.googleapis.com/upload/storage/v1/b/maxr-test/o?alt=json&uploadType=multipart: Call error 5: )
I 16:31:19.729 updated object:%!(EXTRA *storage.Object=<nil>)

2 个答案:

答案 0 :(得分:1)

其中一个解决方案可能是使用Cloud Storage Java Client Library在云存储中上传/写入文件。使用它的优点是它自动支持可恢复/块上传,这样你就不会落入该URL获取请求大小超过错误。这是Go example

答案 1 :(得分:0)

这是由于Google Storage 10MB的限制。 在我的日志中:

com.google.api.services.storage.Storage

这是我发现的,我正在使用Java lib:( 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();

我在google找到了示例,但我的队友仍在调查此事。

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

确定。解决了。 MediaHttpUploader.DEFAULT_CHUNK_SIZE大约是10MB,这已经太多了。一切都低于10MB将被接受。

echo GetEnv("SystemDrive");
// C:

也许这会在你的GO问题中通过类比来解决你的问题

干杯!