esa は API が用意されているが、添付するファイルをアップロードする API はない。
昔のツイートですが、
まだドキュメントがなくて申し訳ないのですが、 https://t.co/PfsQRMNGHp の辺りを参考にしていただくと良いかもしれません。(esaのAPIを使ってS3のダイレクトアップロード用のメタデータを取得して、それを元にS3にアップロードするような形です)
— Atsuo Fukaya (@fukayatsu) April 24, 2018
とのことなので、やってみました。
コマンドラインでお試し
ダイレクトアップロード用のメタデータを取得する
メタデータを取得 API
- POST https://api.esa.io/v1/teams/:team_name/attachments/policies
- type : Content-Type
- name : ファイル名
- size : ファイルサイズ
これを使ってアップロードしたいファイル用のメタデータを取得する。
$ TEAM=yh1224
$ ACCESS_TOKEN=xxxx
$ FILE_NAME=test.png
$ curl -X POST \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-d "type=image/png" \
-d "name=${FILE_NAME}" \
-d "size=$(stat -f%z ${FILE_NAME})" \
"https://api.esa.io/v1/teams/${TEAM}/attachments/policies" | jq
{
"attachment": {
"endpoint": "https://xxxx.s3.ap-northeast-1.amazonaws.com",
"url": "https://xxxx.s3.ap-northeast-1.amazonaws.com/uploads/production/attachments/XXXXX/YYYY/MM/DD/XXXXX/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.png"
},
"form": {
"AWSAccessKeyId": "XXXXXXXXXXXXXXXXXXXX",
"signature": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"policy": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"key": "uploads/production/attachments/XXXXX/YYYY/MM/DD/XXXXX/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.png",
"Content-Type": "image/png",
"Cache-Control": "max-age=31557600, public",
"Content-Disposition": "filename*=UTF-8''test.png",
"acl": "public-read"
}
}
アップロード
POST Object - Amazon S3 REST API
返ってきた form
パラメタに画像ファイル(file
パラメタ)を追加して、attachment.endpoint
の URL に POST すれば良い。アップロードした画像の URL は、attachment.url
でアクセスできる。
$ curl -X POST \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-d "type=image/png" \
-d "name=${FILE_NAME}" \
-d "size=$(stat -f%z ${FILE_NAME})" \
"https://api.esa.io/v1/teams/${TEAM}/attachments/policies" \
> policy.log
$ curl -v \
-F "file=@${FILE_NAME}" \
-F "AWSAccessKeyId=$(jq -r '.form.AWSAccessKeyId' policy.log)" \
-F "signature=$(jq -r '.form.signature' policy.log)" \
-F "policy=$(jq -r '.form.policy' policy.log)" \
-F "key=$(jq -r '.form.key' policy.log)" \
-F "Content-Type=$(jq -r '.form."Content-Type"' policy.log)" \
-F "Cache-Control=$(jq -r '.form."Cache-Control"' policy.log)" \
-F "Content-Disposition=$(jq -r '.form."Content-Disposition"' policy.log)" \
-F "acl=$(jq -r '.form.acl' policy.log)" \
$(jq -r '.attachment.endpoint' policy.log)
できた。