こんにちは、広野です。
先日、以下の記事で React アプリ内にファイル選択 UI をつくる方法を紹介しました。
今回はファイル選択 UI で読み込んだ画像を即時画面内でプレビューするコードを紹介します。多くのサイトで使われているので、あーこれね、とすぐにイメージできると思いますが、実際につくろうと思ったら、?となる方は多いのではないかと思います。
つくりたいもの
こんな画面です。
React コード
前提として、本記事冒頭で紹介した MUI file input モジュールを使用しています。
import React, { useState, useEffect } from 'react'; import { MuiFileInput } from 'mui-file-input'; import Typography from '@mui/material/Typography'; const [file, setFile] = useState(); const [preview, setPreview] = useState(); //ファイルhandleChange関数 const handleChangeFile = (newFile) => { setFile(newFile); }; //メモリ内のBLOBにアクセスするためのURL生成 useEffect(() => { if (file) { setPreview(URL.createObjectURL(file)); } }, [file]); //中略 //ファイル選択 UI <Typography variant="body1" component="h6" mt={1} gutterBottom>ファイル選択</Typography> <MuiFileInput value={file} onChange={handleChangeFile} variant="outlined" /> <br /> <Typography variant="caption" component="div" gutterBottom>PNG/JPEG ファイルのみ、ファイルサイズは5MB以内。</Typography> {(file) && !(file.type === "image/png" || file.type === "image/jpeg") && ( <Typography variant="caption" component="div" color="error.main" gutterBottom>このファイルタイプはサポートしていません。</Typography> )} //プレビュー画面 {(file) && (file.type === "image/png" || file.type === "image/jpeg") && ( <React.Fragment> <Typography variant="caption" component="div" mt={1} gutterBottom>送信画像プレビュー</Typography> <img id="preview" src={preview} alt="preview" className="previewimg"/> </React.Fragment> )}
ファイル選択 UI で取得した BLOB はメモリ内に格納されており、そのままでは <img> タグで表示できないため、createObjectURL で URL 生成してから <img> タグの src 属性に渡しています。
BLOB があるかないか(file ステートが true or false)で <img> タグの表示を判断するようにしています。期待した MIME タイプの画像ファイルを選択していればプレビュー画面が表示されます。
まとめ
いかがでしたでしょうか?
今回は小ネタでした。今後も、少し違うユースケースで BLOB やテキストデータを扱う React コードをいくつか紹介したいと思います。
本記事が皆様のお役に立てれば幸いです。