Heim >Backend-Entwicklung >Golang >Wie implementiert man vorsignierte POST-Uploads in AWS S3 in Go?
Vorsignierte POST-Uploads ermöglichen unbefugten Benutzern den sicheren Upload Dateien in einen S3-Bucket. Im Gegensatz zu vorsigniertem PUT basiert diese Methode auf einer richtlinienbasierten Autorisierung und vereinfacht Dateiübertragungen.
1. Konfigurieren Sie den öffentlichen Lesezugriff für den S3-Bucket:
Legen Sie die folgende Bucket-Richtlinie fest, um den öffentlichen Lesezugriff zu ermöglichen:
{ "Version": "2012-10-17", "Id": "akjsdhakshfjlashdf", "Statement": [ { "Sid": "kjahsdkajhsdkjasda", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::BUCKETNAMEHERE/*" } ] }
2. POST-Richtlinie erstellen:
Erstellen Sie eine POST-Richtlinienvorlage, füllen Sie Schlüsselfelder (Ablauf, Bucket, Schlüssel, Anmeldeinformationen, Datum) aus und kodieren Sie sie:
{ "expiration": "%s", "conditions": [ {"bucket": "%s"}, ["starts-with", "$key", "%s"], {"acl": "public-read"}, {"x-amz-credential": "%s"}, {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, {"x-amz-date": "%s" } ] }
3. Unterzeichnen Sie die Richtlinie:
Verwenden Sie die Anmeldeinformationen des S3-Bucket-Besitzers, um die Signatur zu generieren:
4. Erstellen Sie mehrteilige Formulardaten:
Fügen Sie alle Richtlinienparameter in die mehrteiligen Formulardaten ein:
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 := fw.Write([]byte(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 implementiert man vorsignierte POST-Uploads in AWS S3 in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!