首页 > 解决方案 > 如何以编程方式将图像上传为公共图像?

问题描述

如何在 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(),
    })
}

这里发生了什么我想要第一行我得到第二行 结果:

图片

标签: gogoogle-cloud-platformgoogle-cloud-storage

解决方案


将对象上传到存储桶后,您应该将它们设置为公开。正如您在此处看到的,您可以使用下面的代码将它们公开

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
}

推荐阅读