Maison  >  Article  >  développement back-end  >  Comment implémenter des téléchargements de fichiers POST pré-signés vers AWS S3 à l'aide de Go ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-21 22:30:13943parcourir

How to Implement Pre-Signed POST File Uploads to AWS S3 Using Go?

Téléchargement POST pré-signé vers AWS S3 à l'aide de Go

Pour un téléchargement sécurisé de fichiers vers des compartiments AWS S3, le POST pré-signé offre une solution pratique approche. Voici comment y parvenir dans Go :

1. Configurez l'accès au compartiment :

Modifiez la politique de votre compartiment S3 pour autoriser le téléchargement public :

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

2. Créez une stratégie POST pré-signée :

Créez une stratégie HTTP POST qui accorde l'autorisation de téléchargement :

{ "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" }
    ]
}

Configurez la stratégie avec ces paramètres :

  • expiration : délai d'expiration du téléchargement
  • bucket : bucket S3 cible name
  • key : Nom du fichier à télécharger
  • identifiants : Vos identifiants AWS
  • date : Date actuelle

3 . Signer la stratégie :

Utilisez les informations d'identification du propriétaire du compartiment S3 pour signer la stratégie :

  • Encodez la stratégie en base64
  • Calculez la signature HMAC-SHA256
  • Encoder la signature en hexadécimal chaîne

4. Construire une requête POST :

Générer la demande de données du formulaire en plusieurs parties :

import "github.com/aws/aws-sdk-go/aws/credentials"

type Field struct {
    Key, Value string
}

func Upload(url string, fields []Field) error {
    b := new(bytes.Buffer)
    w := multipart.NewWriter(b)
    for _, field := range fields {
        fw, err := w.CreateFormField(field.Key)
        if err != nil {
            return err
        }
        if _, err := fw.Write([]byte(field.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())

    creds := &credentials.StaticProvider{Value: credentials.Value{
        AccessKeyID:     "AKIAIOSFODNN7EXAMPLE",
        SecretAccessKey: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    }}
    cfg := &aws.Config{Credentials: creds}

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

Fournir les champs de stratégie signés et l'URL du point de terminaison. Votre téléchargement POST pré-signé sur AWS S3 sera alors exécuté.

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:
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