2
3

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.

React + TypeScript ドラッグ&ドロップでファイルアップロード

Posted at

Reactでファイルをドラッグ&ドロップでアップロードする機能を作りました。
使ったのはdrop-zoneではなく、react-drag-drop-filesです。

1.インストール

npm i --save react-drag-drop-files

2.使い方

FileUploaderを使うと自動的にドラッグ&ドロップできるエリアが出てきます。

import React, { useState } from "react";
import { FileUploader } from "react-drag-drop-files";

const UploadArea: React.FC = () => {
  const [file, setFile] = useState<File | null>(null);
  // typesは型がArrayなので配列で指定する
  const fileTypes = ["JPG", "PNG"];
  const handleChange = (file: File) => {
    setFile(file);
  };

  return (
    <>
      <FileUploader
        handleChange={handleChange}
        name="file"
        types={fileTypes}
      />
      {/*選択ファイル名を表示させる*/}
      <p>{file !== null ? `ファイル名:${file['name']}` : ''}</p>
    </>
  );
}

export default UploadArea;

こんな感じで出来上がります。
スクリーンショット 2022-08-19 18.17.21.png

デザインをカスタマイズしたい場合は、
カスタマイズしたコンポーネントを<FileUploader>で囲えばOKです。

おまけ:アップロードする処理

import React, { useState } from "react";
import { FileUploader } from "react-drag-drop-files";

const UploadArea: React.FC = () => {
  const [file, setFile] = useState<File | null>(null);
  const fileTypes = ["JPG", "PNG"];
  const handleChange = (file: File) => {
    setFile(file);
  };

  const handleOnClick = useCallBack( async() => {
    const uploadFile = new FormData();
    uploadFile.append('file', file);

    await axios
      .post('/api/upload', uploadFile {
        headers: {
          'content-type': 'multipart/form-data',
        },
      })
      .then((res) => {
        alert('アップロード成功');
      })
      .catch((err) => {
        alert('アップロード失敗');
      });
  }

  return (
    <>
      <FileUploader
        handleChange={handleChange}
        name="file"
        types={fileTypes}
      />
      <p>{file !== null ? `ファイル名:${file['name']}` : ''}</p>
      <button onClick={() => handleOnClick()}>アップロード</button>
    </>
  );
}

export default UploadArea;

参考記事

2
3
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
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?