Skip to main content

esa に API でファイルをアップロードする

esaAPI が用意されているが、添付するファイルをアップロードする API はない。

昔のツイートですが、

とのことなので、やってみました。

ダイレクトアップロード用のメタデータを取得する

メタデータを取得 API

これを使ってアップロードしたいファイル用のメタデータを取得する。

$ 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`

できた。