【问题标题】:React Hooks and Axios Image Upload with Multer使用 Multer 进行 React Hooks 和 Axios 图像上传
【发布时间】:2021-01-01 17:46:18
【问题描述】:

我正在尝试添加上传图像的功能,然后使用该图像路径更新用户对象。当我使用 Insomnia 客户端上传图像并发送请求时,我能够成功地将图像和路径添加到 MongoDB。 NodeJS 用户路由如下:

const express = require ("express"); 
const router = express.Router(); 
const bcrypt = require("bcryptjs"); 
const jwt = require("jsonwebtoken"); 
const Users = require("../models/users"); 
const auth = require("../middleware/auth"); 
const multer = require('multer');

const storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, './uploads/'); 
    }, 
    filename: function(req, file, cb){
        cb(null, file.originalname); 
    }
}); 

const fileFilter = (req, file, cb) => {
    // reject a file
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype == "image/jpg") {
      cb(null, true);
        } else {
            cb(null, false);
            return cb(new Error('Only .png, .jpg and .jpeg format allowed!'));
        }
  };

const upload = multer({storage: storage, limits: {
    fileSize: 1024 * 1024 * 5 
    }, 

    fileFilter: fileFilter
});
// REQUEST TO FIND USER BY ID AND ADD A PROFILE PICTURE 
router.put('/update/:id', upload.single('userImage'), (req, res) => {
    Users.findById(req.params.id)
    .then(user => {
        user.userImage = req.file.path || user.userImage,

        user 
            .save()
            .then(() => res.json("The User is UPDATED succesfully!"))
            .catch(err => res.status(400).json(`Error: ${err}`)); 
        }) 
    .catch(err => res.status(500).json(`Error: ${err}`));  
    console.log(req.body); 
    console.log(req.file); 

});

但是,当我在客户端上测试代码时,我收到以下 500 错误:“”错误:TypeError:无法读取未定义的属性“路径”。”我正在使用 React Hooks 和 Axios,代码如下:

import React, { useState, useContext } from 'react'; 
import Exit from '../cancel.svg'; 
import Modal from 'react-modal';
import { useForm } from "react-hook-form";
import axios from 'axios';
import UserContext from "../context/UserContext"; 
import { useHistory } from "react-router-dom";


Modal.setAppElement('#root');

const ProfilePicture = () => {
    const [modalIsOpen, setModalIsOpen]= useState (true);
    const { register, handleSubmit } = useForm (); 
    const [userImage, setUserImage] = useState(); 

    const onSubmit = (data) => console.log(data);

    const { userData } = useContext(UserContext); 
    const history = useHistory();


    const changeOnClick = e => {
        const users = {
            userImage
        }; 

        console.log(users); 

         axios
            .put(`http://localhost:5000/users/update/${userData.user.id}`, users)
            .then(res => console.log(res.body))
            .catch(err => {
                console.log(err); 
            }); 
            history.push("/Landing")
    } 

return(
<Modal isOpen={modalIsOpen} onRequestClose={() => setModalIsOpen(false)} className='finishBorder'> 
    <div className='border-bottom-two'>
        <img onClick= {() => setModalIsOpen(false)} className='newexitButton'src={Exit} alt='X' />
            <span className='lastThing'>One last thing! Add a profile picture</span>
    </div>
    <form onSubmit={handleSubmit(changeOnClick)} encType="multipart/form-data" >
        <div>
            <span className="dot"></span>
            <input onChange={e => setUserImage(e.target.value)} ref = {register} type='file' name='userImage' className='picUploader'/>
            {/* <button>submit</button> */}
        </div>
        <div>
            <button type='submit' className='doneButton'>Done</button>
                <div>
                    <span className='laterTwo'>I'll do this later</span>
                </div>
        </div>
    </form>
</Modal>
)

}

export default ProfilePicture; 

感谢您的帮助!

【问题讨论】:

    标签: node.js reactjs react-hooks


    【解决方案1】:

    您从客户端发送的是“假路径”,而不是文件。要从输入中访问文件,请使用:

    setUserImage(e.target.files[0])
    

    另外,我认为 multer 只适用于 multipart/form-data,所以你应该检查一下,但很简单:

    const formData = new FormData();
    formData.append([image name], [image file]);
    axios.post(`http://localhost:5000/users/update/${userData.user.id}`, formData, { 
    headers: { "Content-Type": "multipart/form-data" }})
    

    【讨论】:

    • 谢谢加斯顿!您的回答使我走上了正确的道路;我将正确的工作代码放在上面
    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多