<aside> 🌿 前回に続いて、商品情報登録ページの ・商品画像の登録(画像アップロード)・プレビュー・削除 の実装を行う
</aside>
<aside> 🌿 今回使用するメソッドについてはこちら ドキュメント
Upload files with Cloud Storage on Web | Firebase Storage
</aside>
■目次
componentsディレクトリにProductsディレクトリを作成する

Productsディレクトリ内にImageArea.jsxを作成し、以下のように画像アップロード用コンポーネントを作成する

※ 今回はMUIのicon(Material Icons)を使って、画像アップロードができることを表現する
▼コード例
/**
* <input type="file" />で、クリックするとエクスプローラーやfinderが表示されて、
* ファイルや画像がアップロードできるようになる
* 今回はアイコンをクリックでfinderを表示させたいので、labelタグでラップしつつ、inputタグは
* CSSで非表示にさせている(display: none;)
*/
import { IconButton, styled } from "@mui/material";
import React from "react";
import AddPhotoAlternateIcon from "@mui/icons-material/AddPhotoAlternate";
// フォーカス時の影の形を調整
const CustomizedIconButton = styled(IconButton)`
height: 48px;
width: 48px;
`;
const ImageArea = (props) => {
return (
<div>
<div className="u-text-right">
<span>商品画像を登録する</span>
<CustomizedIconButton>
<label>
<AddPhotoAlternateIcon />
<input className="u-display-none" type="file" id="image" />
</label>
</CustomizedIconButton>
</div>
</div>
);
};
export default ImageArea;
ProductEdit.jsxを開き、ImageAreaコンポーネントを設置する
npm start を実行し、意図した表示がされているか一旦確認する
▼コード例
import React, { useCallback, useState } from "react";
import { PrimaryButton, SelectBox, TextInput } from "../components/UIkit";
import { useDispatch } from "react-redux";
import { saveProduct } from "../reducks/products/operations";
**import ImageArea from "../components/Products/ImageArea";**
const ProductEdit = () => {
〜〜〜
return (
<section>
<h2 className="u-text__headline u-text-center">商品の登録・編集</h2>
<div className="c-section-container">
**<ImageArea />**
〜〜〜
</section>
);
};
export default ProductEdit;
▼イメージ画像


https://www.youtube.com/watch?v=CDW_yryn1Rc&list=PLX8Rsrpnn3IWavNOj3n4Vypzwb3q1RXhr&index=15
event.target.filesで、アップロードした画像やファイルを取得できる
ただし、このままではCloud Storageにアップロードできないため、new Blob を使ってオブジェクトに書き換える必要があるnew Blob で渡せる引数は以下2つ
第一引数:取得した画像やファイル(file)
第二引数:第一引数で指定した画像やファイルの形式
今回は画像なので、"image/jpeg" を指定
ここまでがblob生成の話
次からはファイル名をランダムな文字列で生成する話
ファイル名をそのまま使った場合、万が一Cloud Storageに同じ名前のファイルが既にアップロードされていると競合が起きて色々と面倒
なので、事前にこちらでランダムな文字列を生成し、ファイル名に設定して競合が起きるのを防ごう!ということ💡
const S = ~ 文字列を生成するのに使うアルファベットと数字を定義
const N = 16; 生成される文字列の桁数を指定。今回は16桁
Array.from() 文字列からArray(配列)を生成するメソッド。最終的にmapでまわして一つの配列にし、.join することで生成された配列を連結して、16桁の文字列にしている。