我有一个网络服务器,需要允许管理员上传图像和用户查看图像。
我可以这样上传文件:
bucket, err := client.DefaultBucket()
if err != nil {
return "", fmt.Errorf("client.DefaultBucket: %v", err)
}
fileName := fmt.Sprintf("%v/%v", bucketName, object)
// Upload an object with storage.Writer.
wc := bucket.Object(fileName).NewWriter(ctx)
wc.ChunkSize = 0 // note retries are not supported for chunk size 0.
if _, err = io.Copy(wc, buf); err != nil {
return "", fmt.Errorf("io.Copy: %v", err)
}
// Data can continue to be added to the file until the writer is closed.
if err := wc.Close(); err != nil {
return "", fmt.Errorf("Writer.Close: %v", err)
}
但是获取可下载的 URL 是另一回事。
我发现它可以与模拟器套件一起使用:
url := wc.Attrs().MediaLink
但是,在生产中,在浏览器中打开链接时出现 401 错误,并且在 html 响应中将它们用作 src url 时出现损坏的图像。
我知道有能力获得持续较短时间的 SignedURL。这是不切实际的,而且完全不可能。 我的服务器无法承受每次页面加载时使用 GetSignedURL 来加载数百张图像的费用。
我的前端是免费的 javascript,因此使用客户端 javascript SDK 也不是一个选择。
目标是上传图像,获取下载网址,并将下载网址与其他数据一起保存在数据库中。
使用 Golang Firebase Admin SDK 可以做到这一点吗?
我不确定,因为我没有尝试过,我浏览了 storage-signed-url-object-go 和 start#go_1 的在线文档,所以请告诉我任何信息,我欢迎任何意见或建议来自主题专家的相同意见。
client, err := storage.NewClient(ctx) // ctx := context.Background() pass it to function or else your choice .
if err != nil {
return "", err
}
defer client.Close()
attrs, err := client.Bucket(bucket).Object(object).Attrs(ctx)
if err != nil {
return "", err
}
url, err := storage.SignedURL(bucket, object, &storage.SignedURLOptions{
Method: "GET",
Expires: time.Now().Add(time.Hour),
})
if err != nil {
return "", err
}
return url, nil