App Engine Go Standard - 存储/图像API

时间:2018-05-11 16:08:19

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

我遇到了将服务图像API与云存储/ Blobstore API结合使用的问题。

图片API:https://cloud.google.com/appengine/docs/standard/go/images/

首先,我根本无法使用dev_appserver。它创建了我可以在管理服务器中找到它的BlobKey,但日志显示:

  

Blob with key' encoded_gs_file:ZXBpbG90Z28uYXBwc3BvdC5jb20vZGF0YS9NYWNoaW5lcy8yNTk0Mzg2L2hlaWRlbGJlcmdfYmdfdjIucG5n'不存在

无论如何我以为我会在App Engine中尝试它,在这里我设法让它工作,但我需要给出 allUsers 访问所有者否则我得到:

  

" API错误1(图片:UNSPECIFIED_ERROR)"

通过 gsutil 上传的文件为私有。但我注意到图像必须在存储中公开?或者这是一个错误,无法在文档中找到任何内容,只是serveURL将是公开的。 如果 allUsers 只有读取访问权限,我会得到:

  

" API错误7(图片:ACCESS_DENIED)"

我的测试代码,它只是从给定的bucketpath获取第一个文件并尝试获取serveURL:

ctx := appengine.NewContext(c.Request())
bucketName, err := file.DefaultBucketName(ctx)
if err != nil {
    log.Println(ctx, "failed to get default GCS bucket name: ", err)
    return c.JSON(http.StatusBadRequest, err.Error())
}
client, err := storage.NewClient(ctx)
if err != nil {
    log.Println(ctx, "failed to create client: %v", err)
    return c.JSON(http.StatusBadRequest, err.Error())
}
defer client.Close()
bucket := client.Bucket(bucketName)
files := []storage.ObjectAttrs{}
query := &storage.Query{Prefix: "PATHTOFILE"}
it := bucket.Objects(ctx, query)
for {
    obj, err := it.Next()
    if err == iterator.Done {
        break
    }
    if err != nil {
        log.Println("listBucket: unable to list bucket %q: %v", bucketName, err)
        return c.JSON(http.StatusBadRequest, err.Error())
    }
    files = append(files, *obj)
}
fileName := fmt.Sprintf("/gs/%s/%s", files[0].Bucket, files[0].Name)
blobKey, err := blobstore.BlobKeyForFile(ctx, fileName)
if err != nil {
    errorMessage := Model.ErrorResponseMessage{
        Message: "FailedToGetBlockKey",
        Info: []string{err.Error()},
    }
    errors.Errors = append(errors.Errors, errorMessage)
    return c.JSON(http.StatusBadRequest, errors)
}
options := image.ServingURLOptions{Secure:true, Size:600, Crop:false}
url, err := image.ServingURL(ctx, blobKey, &options)
if err != nil {
    errorMessage := Model.ErrorResponseMessage{
        Message: "FailedToGetServingURL",
        Info: []string{err.Error()},
    }
    errors.Errors = append(errors.Errors, errorMessage)
    return c.JSON(http.StatusBadRequest, errors)
}
return c.JSON(http.StatusOK, url)

0 个答案:

没有答案