Maison > développement back-end > Golang > le corps du texte

Comment réaliser des téléchargements de fichiers POST pré-signés vers AWS S3 à l'aide de Go ?

Mary-Kate Olsen
Libérer: 2024-11-25 06:02:11
original
619 Les gens l'ont consulté

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

Téléchargement POST pré-signé sur AWS S3 dans Go

Problème :

Comment effectuer un POST pré-signé upload pour télécharger des fichiers vers un compartiment AWS S3 à l'aide de Go, sans utiliser le PUT pré-signé traditionnel méthode ?

Solution :

Pour effectuer un téléchargement POST pré-signé, suivez ces étapes :

  1. Configurer le S3 Compartiment pour les téléchargements publics : Définissez la stratégie du compartiment pour autoriser les téléchargements publics uniquement.
  2. Créez une stratégie POST : Générez une stratégie POST qui permet le téléchargement vers une clé, un compartiment spécifique et accorde un accès en lecture publique.
  3. Générer et signez la politique : Utilisez les informations d'identification du propriétaire du compartiment S3 pour générer et signer la politique POST, en la codant en base64 et hex.
  4. Construire et POST des données de formulaire en plusieurs parties : Créez une demande de données de formulaire en plusieurs parties avec les champs suivants :

    • (clé) Le nom de le fichier à télécharger
    • (policy) Le POST encodé en base64 Policy
    • (signature) La signature codée en hexadécimal de la stratégie
    • (x-amz-credential) Les informations d'identification AWS utilisées pour signer la stratégie
    • (x-amz- algorithm) L'algorithme utilisé pour signer la politique (AWS4-HMAC-SHA256)
    • (x-amz-date) La date utilisée pour signer la police

Exemple de code en 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
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal