go - 如何以编程方式将图像上传为公共图像?
问题描述
如何在 Google Cloud Storage 中自动将图像上传为公开?
我试过这个
代码:
func HandleFileUploadToBucket(c *gin.Context) {
bucket := "mybucket"
var err error
ctx := appengine.NewContext(c.Request)
storageClient, err = storage.NewClient(ctx, option.WithCredentialsFile("keys.json"))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
"error": true,
})
return
}
f, uploadedFile, err := c.Request.FormFile("file")
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
"error": true,
})
return
}
defer f.Close()
sw := storageClient.Bucket(bucket).Object(uploadedFile.Filename).NewWriter(ctx)
sw.ACL = []storage.ACLRule{{Entity: storage.AllUsers, Role: storage.RoleReader}} // As you can see here I made it AllUser
sw.CacheControl = "public, max-age=86400"
if _, err := io.Copy(sw, f); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
"error": true,
})
return
}
if err := sw.Close(); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
"error": true,
})
return
}
u, err := url.Parse("/" + bucket + "/user/" + sw.Attrs().Name)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{
"message": err.Error(),
"Error": true,
})
return
}
c.JSON(http.StatusOK, gin.H{
"message": "file uploaded successfully",
"pathname": u.EscapedPath(),
})
}
这里发生了什么我想要第一行我得到第二行 结果:
解决方案
将对象上传到存储桶后,您应该将它们设置为公开。正如您在此处看到的,您可以使用下面的代码将它们公开
func makePublic(w io.Writer, bucket, object string, entity storage.ACLEntity, role storage.ACLRole) error {
// bucket := "bucket-name"
// object := "object-name"
ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
return fmt.Errorf("storage.NewClient: %v", err)
}
defer client.Close()
ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
acl := client.Bucket(bucket).Object(object).ACL()
if err := acl.Set(ctx, entity, role); err != nil {
return fmt.Errorf("ACLHandle.Set: %v", err)
}
fmt.Fprintf(w, "Blob %v is now publicly accessible.\n", object)
return nil
}
推荐阅读
- flutter - Flutter 中的自定义仪表设计
- reactjs - ReactJS SetTimeout / setInterval
- algorithm - 建议将一个数字写为三个数字的总和,其中每个数字至少为 2
- css - 如何修复从“无处”出现的滚动条的这种自我向上滚动效果?
- node.js - 如何使用聚合 mongoDB 从 2 个集合中获取链接数据
- java - 我可以像这样将带有 Map 的 3 个点放入方法参数中吗: private Map addAllMood(Map...map)
- javascript - Cheerio 加载字符串而不替换内部脚本内容
- node.js - 天蓝色事件的相关ID
- python - 二进制数的语法格式
- docker - Filecoin Textileio Powergate 没有足够的矿工来自声誉模块来满足约束错误