Google app engine 使用Go将文件写入Google应用程序引擎存储似乎有10MB的限制?
我正在使用将文件写入GAE存储。只要我试图复制的文件大小小于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
io.Copy
就会返回成功的结果。如果文件大于10MB,myio.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();