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
1005 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!

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