Heim >Backend-Entwicklung >Golang >Laden Sie Dateien mithilfe der REST-API direkt in Google Bucket hoch

Laden Sie Dateien mithilfe der REST-API direkt in Google Bucket hoch

WBOY
WBOYnach vorne
2024-02-05 23:15:03547Durchsuche

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

Frageninhalt

Nach dem Go-Beispiel habe ich den folgenden Code verwendet, um Dateien in Google Bucket hochzuladen:

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)
    }
}

Jetzt habe ich vor, es abzuschließen und eine Rest-API für den Datei-Upload zu erstellen. Dann wurde mir klar, dass der Code nur zum Hochladen lokaler Dateien dient. Wie verpacke ich es so, dass die Datei direkt in den Bucket gelangt, ohne sie zuerst auf den Server hochzuladen?


Richtige Antwort


Es gibt viele Beispiele für den Datei-Upload, die Hauptpunkte sind:

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()
    // ...
}

Übergeben Sie also einfach den f-Text des Datei-Uploads an Ihre Cloud-Upload-Logik, als wäre es eine lokale Datei:

// 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)
}

Das obige ist der detaillierte Inhalt vonLaden Sie Dateien mithilfe der REST-API direkt in Google Bucket hoch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen