我正在尝试从Go服务器端代码中读取Blobstore中的图像。但是如果图像很大(如:0.5MB - 1.7MB),则大部分字节缓冲区变为0,从而破坏图像。
如果我使用serveUrl,图片会有效,但在这种情况下,这不适合我。
我的第一个想法是读取的大小限制为found this:
除系统范围的安全配额外,还有一项限制 使用Blobstore:Blobstore数据的最大大小 应用程序可以读取一个API调用是32兆字节。
我读的图像远不及32MB。
我用来读取Blobstore的函数:
func BlobAsBase64(c appengine.Context, blobKey string) (*blobstore.BlobInfo, string, error) {
info, err := blobstore.Stat(c, appengine.BlobKey(blobKey))
if err != nil {
return nil, "", err
}
imageBuffer := make([]byte, info.Size)
reader := blobstore.NewReader(c, appengine.BlobKey(blobKey))
if _, err = reader.Read(imageBuffer); err != nil {
return nil, "", err
}
imageBase64 := base64.StdEncoding.EncodeToString(imageBuffer)
return info, imageBase64, nil
}
当我从Blobstore读取图像时,我的图像被破坏的原因是什么?
答案 0 :(得分:2)
我猜想这不起作用的原因是因为reader.Read
方法在填充缓冲区之前返回。查看io.Reader
读取读取最多len(p)个字节到p。它返回字节数 读取(0< = n< = len(p))并遇到任何错误。即使阅读 返回n< len(p),它可以使用所有p作为临时空间 呼叫。如果某些数据可用但不是len(p)字节,则读取 通常会返回可用的内容,而不是等待更多内容。
特别注意最后一句。
而不是reader.Read(imageBuffer)
尝试使用ioutil.ReadAll来解决您的问题。