3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby on RailsAdvent Calendar 2022

Day 3

コード量が多い railsサービスで 部分的に webp 対応をしていきたい。

Last updated at Posted at 2022-12-07

サイト内の画像を部分的に順次 webp 対応したい

システムに画像をアップロードした際 webp に変換し
webp がある場合は webp を表示、なければjpgを表示したい

アップロード画像全てを webp にすると問題が起きる

viewファイルで picture タグを利用しないと webp は表示することができないため
全ての画像を webp に変換して、DBに保存するとviewファイル全体の修正が必要になる
image_tagを利用せず と書いて居るのも直す必要がある、非常に辛い。

DBにはjpgで保存

上記の理由から、DBには jpg のままアップロードしたい。
そうすれば既存の画像表示部分には影響を与えない。

webpとjpgの両方をS3に上げる

jpgのままDBに保存する
ただし、webpとjpgの両方をS3にアップロードするようにします

あとはviewファイル側で webp があれば webp
なければ jpg を表示するというロジックを書くだけ

webpがあるかどうか判定する方法

webpがあればpictureタグを利用しないといけないため、webp画像があるかどうか判定しなければなりません。

  • S3に一度問い合わせて webp 拡張子ファイルがあるかどうか確認する(遅いので却下
  • 画像アップロード時に webp 対応のチェックを入れる(画像入稿部分の数だけカラムが増えるから却下

jpgのファイルアップロード時に prefix をつける

webp に変換しS3にアップロードが成功したファイルに関しては
webp_supported_元ファイル名.jpg 画像をこのようなファイル名で保存します。

あとは view ファイルでファイル名を元に webp 対応して居るか確認した上で出しわけを行います。

<% if user.icon_url.include?("webp_supported_") %>
  <% # picture_tag で webp 画像を表示 %>
  <% else %>
  <% # image_tag で jpg 画像を表示 %>
<% end %>

CloudFrontを利用して居るので

CloudFront Functions や LambdaEdge を利用してもう少しスマートにできる方法を模索中です:eyes:

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?