事象
aws s3
cliコマンドでSVGファイルをアップロードすると、content-typeがbinary/octet-stream
になってしまう。
原因
完全に把握できたわけではないですが、
このRequest HeaderのContent-typeのあたりを読むと、defaultとなりうる値が binary/octet-stream
となっている。
jpgなどの他のバイナリファイルはそのままimage/jpg
などのままアップロードしてくれるものの、svgはPUT時に自動で拡張子から読み取ってヘッダ付与しない仕様なのか、default値が取られていると推定されます。
対処
特定のファイルのcontent-typeを書き換える方法はググれば出てきますが、多くのケースでは、一括で静的ファイルをアップロードしてその中のsvgファイルのみ書き換えたいかと思います。
よって、他の拡張子のファイルはいったん除外し、svgのみを指定する方法をとり、汎用コマンドとしました。
$ aws s3 cp --recursive s3://${S3_BUCKET}/images s3://${S3_BUCKET}/images --exclude '*' --include '*.svg' --metadata-directive "REPLACE" --content-type "image/svg+xml"
-
--exclude
で全ファイルを対象外とし -
--include
でsvgファイルのみを含める -
--metadata-directive "REPLACE" --content-type
でContent-typeを置き換える
これでバケットのimagesディレクトリ内のすべてのsvgファイルを再帰的に変更します。
一括アップロード後にこちらのコマンドを叩くよう各種デプロイツールに組み込むとよい。
余談
再現させていませんが、pdfファイルも同様の現象が発生するらしい。