0

5日前にreactとexpress-fileuploadを使用してファイルをアップロードする際に多くの問題を見つけました:ファイルがreq.bodyに渡される間、私のreq.filesは常にnullです: body: {file:'[object File]'} だから私はGoogleで見つけた多くのソリューションを試してみましたが、悲しいことに、ブロブを作成して渡そうとしても何もうまくいきませんでした。 PS: URL をRESTerでテストすると、アップロードされたファイルが機能します。

はいの場合、ファイルをブロブに変換する必要がありますか??

私のフロントエンドはこれです:

import React, { Fragment, useState } from 'react';
import axios from 'axios';

const FileUpload = () => {
  var [file, setFile] = useState('');
  const [filename, setFilename] = useState('Choose File');

  const onChange = e => {
      console.log(e.target.files[0].name)
    setFile([e.target.files[0]]);
    setFilename(e.target.files[0].name);
    console.log(file)
  };
 
  const onSubmit = async e => {
    e.preventDefault();
    const formData = new FormData();
    
    formData.append('file', file);
   console.log("i m here on submit");
    try {
        const res = await axios.post('http://localhost:5001/up', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
          setUploadPercentage(
            parseInt(
              Math.round((progressEvent.loaded * 100) / progressEvent.total)
            )
          );
        }
        
      });
      console.log("file read");
      
    } catch (err) {
     console.log(err)
      setUploadPercentage(0)
    }
  };

  return (
    
      <form onSubmit={onSubmit}>
        <div className='custom-file mb-4'>
          <input
            type='file'
            className='custom-file-input'
            id='customFile'
            onChange={onChange}
          />
          <label className='custom-file-label' htmlFor='customFile'>
            {filename}
          </label>
        </div>
        here: {filename}
      

        <input
          type='submit'
          value='Upload'
          className='btn btn-primary btn-block mt-4'
        />
      </form>
    
  );
};

export default FileUpload;

とバックエンド:

import express from "express"
import React from "react"
import cors from "cors"
import nez_topographie from "./api/controllers/nez_topographie.route.js"
import fileUpload from "express-fileupload"
import multer from "multer"
import bodyParser from "body-parser"
import morgan from "morgan"

const app = express()
app.use(fileUpload())
app.use(cors())
app.use(express.json())




app.use("/nez_topographie", nez_topographie)


app.post('/up', async (req, res) => {
   try {
       console.log(req)
       
       console.log(req.files.file.name)
     



       if(!req.files) {
           console.log("no")
           res.send({
               status: false,
               message: 'No file uploaded'
           });
       } else {
           //Use the name of the input field (i.e. "avatar") to retrieve the uploaded file
           let avatar = req.files.file;
           
           //Use the mv() method to place the file in upload directory (i.e. "uploads")
           avatar.mv('./' + avatar.name);

           //send response
           res.send({
               status: true,
               message: 'File is uploaded',
               data: {
                   name: avatar.name,
                   mimetype: avatar.mimetype,
                   size: avatar.size
               }
           });
       }
   } catch (err) {
       console.log(err)
       res.status(500).send(err);
   }
});

export default app
4

0 に答える 0