はじめに
先日、「オブジェクト名の変更」でアップロード済み画像のサムネイル生成を簡単にという記事を書きました。
その作業の中で、ContentTypeの問題によって一部の画像でImageMagickのリサイズ(サムネイル生成)に失敗していることが分かりました。
今回はなぜそうなったのか、どう対処したのかについてご紹介します。
リサイズに失敗する原因
ContentTypeを指定しないと、application/octet-streamになる
FirebaseのCloud Storageにファイルをアップロードする時にContentTypeが指定されていないと、判別できない場合はアップロード方法に応じてapplication/octet-stream
またはapplication/x-www-form-urlencoded
に設定されます。
実際、一部の画像がapplication/octet-stream
になってしまっていました。
application/octet-streamではImageMagickで画像のリサイズができない
画像のリサイズはImageMagickを利用しています。
ImageMagickでContentTypeがapplication/octet-stream
だと、画像のリサイズができません。
サムネイル生成できるようにする対処法
ContentTypeを書き換える
ContentTypeがapplication/octet-stream
の画像が存在することでImageMagickのリサイズが失敗していることが分かりました。
そこでContentTypeを以下のように書き換えましょう。
// ファイルからメタデータを取得する
const file = await bucket.file(imagePath)
await file.getMetadata()
if (file.metadata.contentType == 'application/octet-stream') {
// octet-streamだったら、image/jpegなどcontentTypeを書き換える
const contentType = 'image/jpeg'
await file.setMetadata({
contentType: contentType,
})
}
サンプルでは簡単なソースコードをご紹介するために、application/octet-streamだったらimage/jpegに決め打ちで置き換えるようにしています。
実際のソースコードはjpg, jpeg, png, gifなど、必要なContentTypeを拡張子で判定してセットしています。
このようなcontentTypeの書き換えを行ったところ、無事にImageMagickで画像のリサイズができるようになりました。
最後に
このようなContentTypeの書き換えが発生しないように、本来はアップロード時にきちんと指定するのが良いと思います。
とはいえアップロード済みの画像のContentTypeを書き換える場面もあるかもしれません。
そんな時はこちらの方法を試してみてください。