#reactjs #mongodb #multer
Вопрос:
Я пытаюсь создать загрузчик изображений, но я получаю эту ошибку всякий раз, когда пытаюсь загрузить изображение. я думаю, что все конфигурации, которые я сделал с multer, в порядке, поэтому я не могу найти, в чем ошибка.
Я делаю это с помощью модуля multer. Если кто-нибудь может мне помочь, я был бы очень признателен, так как я довольно долго пытался решить эту ошибку, и я продолжаю получать ту же ошибку.
на стороне сервера:
const express = require('express');
const router = express.Router();
const multer = require('multer');
const Clients = require('../models/clients.js')
const storage = multer.diskStorage({
destination: (req, file, callback) => {
callback(null, "./uploads")
},
filename: (req, file, callback) => {
callback(null, file.originalname)
}
})
const upload = multer({storage: storage})
router.route('/').get((req, res) => {
Clients.find()
.then(client => res.json(client))
.catch(err => res.status(400).json('Error:' err))
})
router.route('/add', upload.single("articleimage")).post((req, res) => {
const newClient = new Clients({
image: req.file.originalname,
firstName: req.body.firstName,
lastName: req.body.lastName,
weight: req.body.weight,
BMI: req.body.BMI
})
newClient.save()
.then (() => res.json(newClient))
.catch(err => res.status(400).json('error' err))
})
module.exports = router
Сторона клиента:
import React, {useState} from 'react'
import FileBase64 from 'react-file-base64';
import axios from 'axios'
function AddClient() {
const [firstName, setFirstName] = useState('')
const [lastName, setLastName] = useState('')
const [weight, setWeight] = useState('')
const [BMI, setBMI] = useState('')
const [image, setImage] = useState('')
const selectedFile = (e) => {
setImage(e.target.files[0])
}
console.log(image)
const submitForm = (e) => {
e.preventDefault()
const formData = new FormData()
formData.append("image", image)
formData.append("firstName", firstName)
formData.append("lastName", lastName)
formData.append("weight", weight)
formData.append("BMI", BMI)
axios.post('http://localhost:4000/clients/add', formData)
.then(res => console.log(res))
}
console.log(firstName)
return (
<div>
<form class="w-full max-w-lg" onSubmit={submitForm} encType="multipart/form-data">
<div class="flex flex-wrap -mx-3 mb-6">
<input type="file" filename="articleimage" onChange={selectedFile}/>
<div class="w-full md:w-1/2 px-3 mb-6 md:mb-0">
<label class="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2" for="grid-first-name">
First Name
</label>
<input class="appearance-none block w-full bg-gray-200 text-gray-700 border border-red-500 rounded py-3 px-4 mb-3 leading-tight focus:outline-none focus:bg-white" id="grid-first-name" type="text" onChange={(e) => setFirstName(e.target.value)} placeholder="First Name" />
<p class="text-red-500 text-xs italic">Please fill out this field.</p>
</div>
<div class="w-full md:w-1/2 px-3">
<label class="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2" for="grid-last-name">
Last Name
</label>
<input class="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500" id="grid-last-name" type="text" onChange={(e) => setLastName(e.target.value)} placeholder="Last Name" />
</div>
</div>
<div class="flex flex-wrap -mx-3 mb-6">
<div class="w-full md:w-1/2 px-3 mb-6 md:mb-0">
<label class="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2" for="grid-first-name">
Weight
</label>
<input class="appearance-none block w-full bg-gray-200 text-gray-700 border border-red-500 rounded py-3 px-4 mb-3 leading-tight focus:outline-none focus:bg-white" id="grid-first-name" type="text" onChange={(e) => setWeight(e.target.value)} placeholder="Weight" />
<p class="text-red-500 text-xs italic">Please fill out this field.</p>
</div>
<div class="w-full md:w-1/2 px-3">
<label class="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2" for="grid-last-name">
Body Mass Index (BMI)
</label>
<input class="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500" id="grid-last-name" type="text" onChange={(e) => setBMI(e.target.value)} placeholder="BMI" />
</div>
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">Add Client</button>
</div>
</form>
</div>
)
}
export default AddClient
Комментарии:
1. Можете ли вы попробовать console.log(req.файл) до того, как const NewClient = новые клиенты({? И добавьте этот console.log() в вопрос.
2. как вы можете утешить. войдите в систему на стороне сервера? Когда я помещаю console.log, ничего не выводится
3. Просто сделайте console.log(‘Файл: ‘, req.файл);
4. там написано
File: undefined
5. Это означает, что Мультер не загружал файл, и именно поэтому вы не можете получить доступ к свойству originalname.. Вы видите, что ваш файл загружен?
Ответ №1:
На стороне клиента вы добавляете данные формы как formData.append("image", image)
, но на стороне сервера вы пишете «изображение статьи» в upload middleware
. Измените его на «изображение», т. е. такое же, как на стороне клиента.
Кроме того, я бы предложил, чтобы код контроллера для загрузки/сохранения изображения и сохранения имени изображения в базе данных были разделены.
Вы должны создать новую функцию контроллера, которая просто сохраняет изображение на вашем сервере и возвращает имя изображения. Вызовите эту функцию контроллера через вызов API в функции selectedFile
обратного вызова. А затем сохраните возвращенное имя изображения в состоянии и, наконец, перейдите к отправке формы и сохраните данные в базе данных.
Комментарии:
1. все еще не работает после изменения имени на стороне сервера и на стороне клиента
2. Это все еще дает ту же ошибку?
undefined
?3. Была ли она решена? Потому что я скопировал всю вашу кодовую базу и протестировал ее. Это давало мне ту же ошибку, пока я немного не изменил код сервера. Я изменил функцию маршрута с этого:-
router.route('/add', upload.single("articleimage")).post((req, res) => {}
на это:-router.route('/add').post(upload.single("image"), (req,res)=>{}
. Попробуйте это, если вы все еще получаете сообщение об ошибке.