首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >上传请求-上传文件- React / Express / Multer - req.file =未定义

上传请求-上传文件- React / Express / Multer - req.file =未定义
EN

Stack Overflow用户
提问于 2022-08-16 00:31:37
回答 1查看 49关注 0票数 0

我正在为一个学校项目开发一个社交网络,我想让用户更新他/她的信息,特别是个人资料照片和封面照片。

我使用multer存储图像。

当我尝试使用POST请求上传图像时,它运行得非常好,但是对于PUT请求,它说req.file /req.files总是未定义的

代码语言:javascript
代码运行次数:0
运行
复制
// FORM (IMPORTANT PART) 
<form
          className="update__form"
          onSubmit={handleSubmit}
          encType="multipart/form-data"
          id="form"
        >
          {/* GESTION PHOTO DE COUVERTURE */}
          <div className="update__form-cover">
            <input
              type="file"
              name="coverPhotoUrl"
              className="update__form-cover-input"
              id="cover"
              accept="image/*"
              onChange={handleCover}
            />
            <div className="update__form-cover-button">
              Modifier la photo de couverture
            </div>
          </div>
          <div
            className={
              loadCover === true
                ? 'update__form-cover-img'
                : 'update__form-cover-img--close'
            }
          >
            <img id="coverImg" alt="ok" />
          </div>
          {/* GESTION PHOTO DE PROFIL */}
          <div className="update__form-profile">
            <input
              type="file"
              name="profilePhotoUrl"
              className="update__form-profile-input"
              id="profile"
              accept="image/*"
              onChange={handleProfile}
            />
            <div className="update__form-profile-button">
              Modifier la photo de profil
            </div>
          </div>
          <div
          
 //   MY DIFFERENTS FUNCTIONS
   // TO DISPLAY AND STORE THE NEW COVER (USESTATE)
   const handleCover = () => {
    const coverChange = document.getElementById('cover').files

    if (coverChange.length > 0) {
      const fileReader = new FileReader()

      fileReader.onload = function (event) {
        document
          .getElementById('coverImg')
          .setAttribute('src', event.target.result)
        setLoadCover(true)
        setData({
          ...data,
          coverPhotoUrl: coverChange[0],
        })
      }
      fileReader.readAsDataURL(coverChange[0])
    }
  }

  // DISPLAY AND STORE THE NEW PROFILE PHOTO (USESTATE)
  const handleProfile = () => {
    const profileChange = document.getElementById('profile').files
    setData({
      ...data,
      profilePhotoUrl: profileChange[0].name,
    })

    if (profileChange.length > 0) {
      const test = new FileReader()

      test.onload = function (event) {
        document
          .getElementById('profileImg')
          .setAttribute('src', event.target.result)
        setLoadProfile(true)
      }
      test.readAsDataURL(profileChange[0])
    }
  }

  // FUNCTION CALLED WHEN FORM IS SUBMITTED
  const handleSubmit = (event) => {
    event.preventDefault()

    try {
      updateUser(data)
    } catch (err) {
      console.log(err)
    }
  }

// FUNCTION TO FETCH PUT 
const updateUser = (data) => {
  console.log(data)
  const userId = localStorage.getItem('userId')
  fetch('http://localhost:8000/api/user/' + userId, {
    method: 'PUT',
    headers: {
      'Content-Type': 'form-data',
    },
    body: JSON.stringify(data),
  })
}

export default updateUser

// BACK CONFIG
const multer = require('multer');

const MIME_TYPES = {
    'image/jpg': 'jpg',
    'image/jpeg': 'jpeg',
    'image/png': 'png',
    'image/svg': 'svg',
}

const storage = multer.diskStorage({
    destination: (req, file, callback) => {
        callback(null, '../images')
    },
    filename: (req, file, callback) => {
        const name = file.originalname.split(' ').join('_');
        const extension = MIME_TYPES[file.mimetype];
        callback(null, name + Date.now() + '.' + extension);
    }
});

const upload = multer({ storage: storage });
router.put('/:id', upload.array(), userCtrl.updateUser);

// CONTROLLER (not very important HERE BUT RETURN REQ.FILE UNDEFINED)
exports.updateUser = ((req, res, next) => {
    console.log(req.file)
    console.log(req.files)
    const userInfos = req.file ? {
        ...JSON.parse(req.body.data),
        coverPhotoUrl: `${req.protocol}://${req.get('host')}/images/${req.file.filename}`
    } : {
        ...req.body
    };

    delete userInfos._userId;

    User.findOne({
        _id: req.params.id
    })
        .then((user)=> {
            User.updateOne({
                _id: req.params.id
            },
            {
                ...userInfos,
                _id: req.params.id
            })
                .then(()=> res.status(200).json({ message : 'infos mises à jour ! '}))
                .catch((error)=> res.status((401)).json({ error }));
        })
        .catch((error)=> res.status(400).json({ error }));
});

EN

回答 1

Stack Overflow用户

发布于 2022-08-19 13:13:06

如果有人来了,我终于找到了答案:

首先:使用formData constrcutor 表格数据信息mdn,将您的数据放入(formdata.append())中;第二:在将要获取的函数上(从前到后):只要删除“内容类型”,浏览器就会自动设置它,然后它将正常运行。

我也想为这个“无用”的帖子道歉,因为所有的答案都在这个论坛上(和网上),我的眼睛都闭上了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73367640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档