Blobstore阅读器不会读取大图像

时间:2014-05-21 16:40:35

标签: google-app-engine go blobstore

我正在尝试从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读取图像时,我的图像被破坏的原因是什么?

1 个答案:

答案 0 :(得分:2)

我猜想这不起作用的原因是因为reader.Read方法在填充缓冲区之前返回。查看io.Reader

的合同
  

读取读取最多len(p)个字节到p。它返回字节数   读取(0< = n< = len(p))并遇到任何错误。即使阅读   返回n< len(p),它可以使用所有p作为临时空间   呼叫。如果某些数据可用但不是len(p)字节,则读取   通常会返回可用的内容,而不是等待更多内容。

特别注意最后一句。

而不是reader.Read(imageBuffer)尝试使用ioutil.ReadAll来解决您的问题。