Bagaimana untuk Melaksanakan Muat Naik POST Pra-tandatangan ke AWS S3 dalam Go?

Linda Hamilton
Lepaskan: 2024-11-24 00:45:14
asal
925 orang telah melayarinya

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

Muat naik POST pra-tandatangan ke AWS S3 dalam Go: Panduan Komprehensif

Latar Belakang

Muat naik POST pra-tandatangan membenarkan pengguna yang tidak dibenarkan memuat naik dengan selamat fail ke baldi S3. Tidak seperti PUT yang ditandatangani sebelumnya, kaedah ini bergantung pada kebenaran berasaskan dasar dan memudahkan pemindahan fail.

Langkah-Langkah untuk Muat Naik POST Pra-tandatangan

1. Konfigurasikan Akses Baca Awam untuk Baldi S3:

Tetapkan dasar baldi berikut untuk mendayakan akses baca awam:

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

2. Jana Dasar POST:

Buat templat dasar POST, isikan medan utama (tamat tempoh, baldi, kunci, bukti kelayakan, tarikh) dan kodkannya:

{ "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" }
    ]
}
Salin selepas log masuk

3. Tandatangan Polisi:

Gunakan kelayakan pemilik baldi S3 untuk menjana tandatangan:

  • Isi nilai dasar.
  • Base64 mengekod dasar.
  • HMAC-SHA256 yang dasar.
  • Hex mengekod tandatangan.

4. Bina Data Borang Berbilang Bahagian:

Sertakan semua parameter dasar dalam data borang berbilang bahagian:

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
}
Salin selepas log masuk

Sumber

  • [Dokumen AWS S3: Pra- ditandatangani POST](https://docs.aws.amazon.com/AmazonS3/latest/userguide/post-object.html)
  • [GitHub: Pustaka POST pra-tandatangan untuk Go](https://github .com/danlami/presigned-post/tree/main/pkg/presigned)

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Muat Naik POST Pra-tandatangan ke AWS S3 dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan