【React】アップロードした画像のプレビュー・リサイズ機能を実装する
やりたいこと
input[type="file"]
で選択した画像ファイルを表示したい- 単一の画像ファイルを想定
- プレビューする前に画像をリサイズしたい
- submit・POST云々の処理は実装せず、あくまでプレビューまで
1. 画像のバリデーション
画像のサイズ・MIMEタイプを検証する関数を実装しておく。
2. カスタムフックの実装
画像のアップロード・プレビューのためのカスタムフックを実装する。
- プレビュー用の画像を
Blob
形式でstateとして保持- 後述のリサイズ処理、ひいてはsubmitすることを考慮
FileReader
クラスを利用し、読み込みが完了した際にstateを更新
3. DOMの実装
あとは先ほどのカスタムフックを利用し、画像選択・プレビュー用のDOMを実装するだけ。
Blob
からオブジェクトURLを生成すれば、選択した画像ファイルがプレビューとして表示される。
4. 画像のリサイズ機能を追加
サイズや通信量を考慮し、submitする前、ひいてはプレビュー前に画像リサイズしたい場合。
ライブラリの利用も検討したが、こちらの記事のCanvasを使った方法でお手軽にできそうだったので参考にさせていただいた。
Blob
として画像を受け取り、任意の幅にリサイズしてからBlob
として返す。
あとはその処理をカスタムフックのpreviewImg()
内に追加すれば完了。これでリサイズしたものがプレビューとして表示されるようになった。
もしこのリサイズした画像を送信したい場合は、このBlob
をformData
にsetしたりfetch()
のbodyに渡すことで実現できる。