はじめに
先日、「オブジェクト名の変更」でアップロード済み画像のサムネイル生成を簡単にという記事を書きました。
その作業の中で、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を以下のように書き換えましょう。
// ファイルからメタデータを取得するconstfile=awaitbucket.file(imagePath)awaitfile.getMetadata()if(file.metadata.contentType=='application/octet-stream'){// octet-streamだったら、image/jpegなどcontentTypeを書き換えるconstcontentType='image/jpeg'awaitfile.setMetadata({contentType:contentType,})}
サンプルでは簡単なソースコードをご紹介するために、application/octet-streamだったらimage/jpegに決め打ちで置き換えるようにしています。
実際のソースコードはjpg, jpeg, png, gifなど、必要なContentTypeを拡張子で判定してセットしています。
このようなcontentTypeの書き換えを行ったところ、無事にImageMagickで画像のリサイズができるようになりました。
最後に
このようなContentTypeの書き換えが発生しないように、本来はアップロード時にきちんと指定するのが良いと思います。
とはいえアップロード済みの画像のContentTypeを書き換える場面もあるかもしれません。
そんな時はこちらの方法を試してみてください。