web-dev-qa-db-ja.com

curlルートを介してAmazon S3にアップロードする

ファイルアップロードをセットアップしようとしていますREST Spring Boot経由のAPI。

私は現在リスト/ GETメソッドを持っていますcurl http://localhost:8080/api/aws/s3/listは、バケットに現在存在するオブジェクトのリストを返します。

アップロードのために、私は試しています:

curl -F "[email protected]" http://localhost:8080/api/aws/s3/upload -i

生成されるもの:

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Date: Sun, 25 Jun 2017 23:28:36 GMT
X-Application-Context: application
Content-Type: application/json;charset=utf-8
Transfer-Encoding: chunked

しかし、バケットを見ると、新しいファイルで更新されていません。

これはAWSのアクセス許可の問題ですか?私のアカウントだけが読み取りおよび書き込みアクセス権を持っています。作成したユーザーとグループには管理者権限があります。バケットポリシーは追加しませんでした。これは私のCORS設定です:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

ここに春の私のS3コントローラのアップロードセクションがあります:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public List<PutObjectResult> upload(@RequestParam("file") MultipartFile[] multipartFiles) {
    return s3Wrapper.upload(multipartFiles);
}
9
mookamooka

S3の使用バケット名といくつかのパラメータを指定する必要があります。そして、それはPOSTではなくPUTだと思います。インターネットには、いくつかのコマンドラインサンプルがあります。

file=/path/to/file/to/upload.tar.gz
bucket=your-bucket
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key=xxxxxxxxxxxxxxxxxxxx
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
  -H "Host: ${bucket}.s3.amazonaws.com" \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  https://${bucket}.s3.amazonaws.com/${file}
15
hiropon

コントローラに設定したパラメータはfileでしたが、カールルートではdataを使い続けたためです

0
mookamooka