首頁 > 後端開發 > Golang > 主體

使用 REST API 將檔案直接上傳到 Google 儲存桶

WBOY
發布: 2024-02-05 23:15:03
轉載
487 人瀏覽過

使用 REST API 将文件直接上传到 Google 存储桶

問題內容

按照 go 範例,我使用以下程式碼將檔案上傳到 google 儲存桶:

func uploadFile(bucket string, uploadFilePath string, destFilePath string) error {
    os.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "./credential.json")
    ctx := context.Background()
    client, err := storage.NewClient(ctx)
    if err != nil {
        return fmt.Errorf("storage.NewClient: %v", err)
    }
    defer client.Close()

    // Open local file.
    f, err := os.Open(uploadFilePath)
    if err != nil {
        return fmt.Errorf("os.Open: %v", err)
    }
    defer f.Close()

    ctx, cancel := context.WithTimeout(ctx, time.Second*50)
    defer cancel()
    o := client.Bucket(bucket).Object(destFilePath)
    o = o.If(storage.Conditions{DoesNotExist: true})
    
    // Upload an object with storage.Writer.
    wc := o.NewWriter(ctx)
    if _, err = io.Copy(wc, f); err != nil {
        return fmt.Errorf("io.Copy: %v", err)
    }
    if err := wc.Close(); err != nil {
        return fmt.Errorf("Writer.Close: %v", err)
    }
    return nil
}

func main() {
    bucket := "g1-mybucket-001"
    targetFilePath := "./somefile.txt"
    destFilePath := "it_poc_test_folder/somefile.txt"
    err := uploadFile(bucket, targetFilePath, destFilePath)
    if err != nil {
        fmt.Println(fmt.Errorf("Error uplolading file: %v", err))
    } else {
        fmt.Printf("%s uploaded to %s.\n", targetFilePath, destFilePath)
    }
}
登入後複製

現在我計劃將其包裝起來,創建一個用於文件上傳的 rest api。然後我意識到該程式碼僅用於上傳本機檔案。如何包裝它以便文件直接進入儲存桶,而不需要先將其上傳到伺服器?


正確答案


有很多檔案上傳範例,重點是:

func uploadfile(w http.responsewriter, r *http.request) {

    // ... 
    r.parsemultipartform(10 << 20)
    f, handler, err := r.formfile("myfile")
    if err != nil {
        // handle err
    }
    defer f.close()
    // ...
}
登入後複製

因此,只需將文件上傳的 f 主體傳遞到您的雲端上傳邏輯,就好像它是本機檔案一樣:

// same code - different `f` source

// Upload an object with storage.Writer.
wc := o.NewWriter(ctx)
if _, err = io.Copy(wc, f); err != nil {
    return fmt.Errorf("io.Copy: %v", err)
}
登入後複製

以上是使用 REST API 將檔案直接上傳到 Google 儲存桶的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
lol
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!