使用Golang的Firebase存储-如何上传文件并使用令牌获取下载URL

yyyllmsg  于 2023-04-18  发布在  Go
关注(0)|答案(1)|浏览(135)

我有一个用Rescript编写的FE应用程序,它处理将文件上传到GCP中的Firebase存储并返回下载URL。该URL包含一个令牌(没有到期日期),允许任何拥有链接的人下载文件。代码如下:

let storageRef = Firebase.Storage.makeRef(storage, `${id}/${filename}`)
Firebase.Storage.getDownloadURL(storageRef)->Promise.then(url =>...)

结果URL类似于:

firebasestorage.googleapis.com/v0/b/{my-bucket}/o/{object-path}?alt=media&token={some-token}

现在,我正在编写一个golang脚本来将一些文件迁移到我们的存储中。我弄清楚了如何上传文件并获得下载URL,但它与rescript代码获得的URL非常不同。我的代码如下所示:

config := &firebase.Config{
    StorageBucket: myBucketName,
}
app, err := firebase.NewApp(context.Background(), config, option.WithCredentialsFile(myServiceAccountKeyFileName))
if err != nil {
    log.Fatalf("error initializing app: %v\n", err)
}

client, err := app.Storage(context.Background())
if err != nil {
    log.Fatalf("error initializing storage client: %v\n", err)
}

file, err := os.Open(myFilePath)
if err != nil {
    log.Fatalf("error opening file: %v\n", err)
}
defer file.Close()

ctx := context.Background()

bucket, err := client.DefaultBucket()
if err != nil {
    log.Fatalf("error getting default bucket: %v\n", err)
}

object := bucket.Object(myFilePath)
writer := object.NewWriter(ctx)

if _, err := io.Copy(writer, file); err != nil {
    log.Fatalf("error uploading file: %v\n", err)
}

if err := writer.Close(); err != nil {
    log.Fatalf("error closing writer: %v\n", err)
}

fmt.Println("File uploaded successfully")

downloadURL, err := bucket.SignedURL(object.ObjectName(), &storage.SignedURLOptions{
    Expires: time.Now().AddDate(100, 0, 0),
    Method:  "GET",
})
if err != nil {
    log.Fatalf("error getting download URL: %v\n", err)
}

但下载URL的形式完全不同:

https://storage.googleapis.com/{my-bucket-name}/{filename}?Expires={timestamp}&GoogleAccessId={my-service-account}&Signature={long-signature}

当URL工作并允许我下载文件时,它的结构与上面的完全不同。我如何使用Go代码上传文件并以与Rescript代码相同的格式检索下载URL?

mo49yndu

mo49yndu1#

第一个URL是所谓的下载URL,由Firebase SDK生成,用于提供对文件的公共只读访问。
第二个URL是由Google Cloud SDK生成的所谓的签名URL,以提供对文件的公共读和/或写访问。
无法从Google Cloud SDK生成下载URL,但有一个技巧可以让您通过设置文件上的firebaseStorageDownloadTokens元数据来自己生成这样的URL。有关此示例,请参阅以下答案:Get Download URL from file uploaded with Cloud Functions for Firebase

相关问题