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

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

昔のツイートですが、

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

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

メタデータを取得 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`

できた。