アップロードしたファイルにContentTypeが設定されてなかった
旧タイトル:ブラウザーで直接開くことができないPDFファイルが存在する
事象
Amazon S3を静的ウェブサイトに設定し PDFファイルを置いているが、ブラウザーで直接開くことができるファイルと 一旦ダウンロードされるファイルが存在している。
ダウンロードされたファイル自体はブラウザーで開くことができるので、ファイルが壊れている訳ではない。
原因
S3にアップロードされたファイルのContentTypeが正しく設定されていなかった。
ブラウザーで直接開くことができるファイル → ContentType:application/pdf
ダウンロードされるファイル → ContentType:binary/octet-stream
S3にアップロードする際、AWSコンソールからアップロードするとファイルの種類により適切にContentTypeが設定されるようだが、CLIやスクリプト(Boto3)経由の場合、設定しない限りデフォルトでbinary/octet-streamが設定されるようだ。
対策
その1
ファイルのアップロードはAWSコンソールからおこなう。
その2
スクリプト経由でアップロードする際に、ContentTypeの設定をおこなうようにする。
Boto3を利用する場合、upload_file()ではContentTypeの設定ができないため、put_object()を使用する必要がある。
upload_ws3.pyはContentType対応の修正済み。
参考:pythonでS3にメタデータをつけてファイルをアップする - たそらぼ
設定するContentTypeの値については、以下を参照
Content-Typeの一覧 #メモ - Qiita
content-type一覧