Quantcast
Viewing all articles
Browse latest Browse all 8691

ContentType書き換えでImageMagickのリサイズを成功させる

はじめに

先日、「オブジェクト名の変更」でアップロード済み画像のサムネイル生成を簡単にという記事を書きました。
その作業の中で、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を書き換える場面もあるかもしれません。
そんな時はこちらの方法を試してみてください。


Viewing all articles
Browse latest Browse all 8691

Trending Articles