Maison > développement back-end > Golang > Comment implémenter des téléchargements POST pré-signés vers AWS S3 en Go ?

Comment implémenter des téléchargements POST pré-signés vers AWS S3 en Go ?

Linda Hamilton
Libérer: 2024-11-24 00:45:14
original
987 Les gens l'ont consulté

How to Implement Pre-signed POST Uploads to AWS S3 in Go?

Téléchargement POST pré-signé sur AWS S3 in Go : un guide complet

Contexte

Les téléchargements POST pré-signés permettent aux utilisateurs non autorisés de télécharger en toute sécurité fichiers dans un compartiment S3. Contrairement au PUT pré-signé, cette méthode repose sur une autorisation basée sur des politiques et simplifie les transferts de fichiers.

Étapes du téléchargement POST pré-signé

1. Configurez l'accès public en lecture pour le compartiment S3 :

Définissez la stratégie de compartiment suivante pour activer l'accès public en lecture :

{
    "Version": "2012-10-17",
    "Id": "akjsdhakshfjlashdf",
    "Statement": [
        {
            "Sid": "kjahsdkajhsdkjasda",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKETNAMEHERE/*"
        }
    ]
}
Copier après la connexion

2. Générer une politique POST :

Créez un modèle de politique POST, remplissez les champs clés (expiration, compartiment, clé, informations d'identification, date) et encodez-le :

{ "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" }
    ]
}
Copier après la connexion

3. Signez la stratégie :

Utilisez les informations d'identification du propriétaire du compartiment S3 pour générer la signature :

  • Remplissez les valeurs de la stratégie.
  • Encodez la stratégie en Base64.
  • HMAC-SHA256 la politique.
  • Encodage hexadécimal du signature.

4. Construire des données de formulaire en plusieurs parties :

Inclure tous les paramètres de stratégie dans les données du formulaire en plusieurs parties :

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
}
Copier après la connexion

Ressources

  • [AWS S3 Docs : Pre- signé POST](https://docs.aws.amazon.com/AmazonS3/latest/userguide/post-object.html)
  • [GitHub : bibliothèque POST pré-signée pour Go](https://github .com/danlami/presigned-post/tree/main/pkg/presigned)

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