Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich mit Go vorsignierte POST-Datei-Uploads in AWS S3 durchführen?

Wie kann ich mit Go vorsignierte POST-Datei-Uploads in AWS S3 durchführen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-25 06:02:11623Durchsuche

How to Achieve Pre-signed POST File Uploads to AWS S3 using Go?

Vorsignierter POST-Upload auf AWS S3 in Go

Problem:

So führen Sie einen vorsignierten POST durch Upload zum Hochladen von Dateien in einen AWS S3-Bucket mit Go, ohne den herkömmlichen vorsignierten PUT zu verwenden Methode?

Lösung:

Um einen vorsignierten POST-Upload durchzuführen, befolgen Sie diese Schritte:

  1. Konfigurieren Sie den S3 Bucket für öffentliche Downloads: Legen Sie die Bucket-Richtlinie so fest, dass öffentliche Downloads zugelassen werden Nur.
  2. Erstellen Sie eine POST-Richtlinie:Generieren Sie eine POST-Richtlinie, die das Hochladen in einen bestimmten Schlüssel und Bucket ermöglicht und öffentlichen Lesezugriff gewährt.
  3. Generieren und signieren Sie die Richtlinie: Verwenden Sie die Anmeldeinformationen des S3-Bucket-Besitzers, um die POST-Richtlinie zu generieren und zu signieren, indem Sie sie in base64 kodieren und hex.
  4. Mehrteilige Formulardaten erstellen und posten: Erstellen Sie eine mehrteilige Formulardatenanforderung mit den folgenden Feldern:

    • (Schlüssel) Der Name von die hochzuladende Datei
    • (Richtlinie) Der base64-codierte POST Richtlinie
    • (signatur) Die hexadezimal codierte Signatur der Richtlinie
    • (x-amz-credential) Die AWS-Anmeldeinformationen, die zum Signieren der Richtlinie verwendet werden
    • (x-amz- Algorithmus) Der zum Signieren der Richtlinie verwendete Algorithmus (AWS4-HMAC-SHA256)
    • (x-amz-date) Das Datum, das für die Unterzeichnung der Richtlinie verwendet wird

Beispielcode in Go:

import (
    "bytes"
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "strings"
)

// Fields represents the fields to be uploaded in the multipart form data request.
type Fields struct {
    Key, Value string
}

// Upload performs a Pre-signed POST upload using the provided URL and fields.
func Upload(url string, fields []Fields) error {
    var b bytes.Buffer
    w := multipart.NewWriter(&b)
    for _, f := range fields {
        fw, err := w.CreateFormField(f.Key)
        if err != nil {
            return err
        }
        if _, err := io.WriteString(fw, f.Value); err != nil {
            return err
        }
    }
    w.Close()

    req, err := http.NewRequest("POST", url, &b)
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", w.FormDataContentType())

    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        return err
    }
    if res.StatusCode != http.StatusOK {
        err = fmt.Errorf("bad status: %s", res.Status)
    }
    return nil
}

Das obige ist der detaillierte Inhalt vonWie kann ich mit Go vorsignierte POST-Datei-Uploads in AWS S3 durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn