> 백엔드 개발 > Golang > Go를 사용하여 AWS S3에 미리 서명된 POST 파일 업로드를 구현하는 방법은 무엇입니까?

Go를 사용하여 AWS S3에 미리 서명된 POST 파일 업로드를 구현하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-21 22:30:13
원래의
1049명이 탐색했습니다.

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

Go를 사용하여 AWS S3에 미리 서명된 POST 업로드

AWS S3 버킷에 안전하게 파일을 업로드하기 위해 미리 서명된 POST는 편리한 접근하다. Go에서 이 작업을 수행하는 방법은 다음과 같습니다.

1. 버킷 액세스 구성:

공개 다운로드를 허용하도록 S3 버킷 정책 수정:

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

2. 미리 서명된 POST 정책 생성:

업로드 권한을 부여하는 HTTP POST 정책 작성:

{ "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" }
    ]
}
로그인 후 복사

다음 매개변수로 정책을 구성합니다.

  • expiration: 업로드 만료 시간
  • 버킷: 대상 S3 버킷 name
  • key: 업로드할 파일 이름
  • credentials: AWS 자격 증명
  • date: 현재 날짜

3 . 정책 서명:

S3 버킷 소유자의 자격 증명을 사용하여 정책에 서명합니다.

  • base64를 사용하여 정책 인코딩
  • HMAC-SHA256 서명 계산
  • 서명을 16진수로 인코딩합니다. 문자열

4. POST 요청 구성:

다중 부분 양식 데이터 요청 생성:

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
}
로그인 후 복사

서명된 정책 필드와 엔드포인트 URL을 제공합니다. 그러면 AWS S3에 대한 사전 서명된 POST 업로드가 실행됩니다.

위 내용은 Go를 사용하여 AWS S3에 미리 서명된 POST 파일 업로드를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿