#javascript #node.js #reactjs #axios #form-data
Вопрос:
Я пытаюсь разрешить пользователям загружать фотографии в мое приложение (интерфейс React, серверная часть узла). Я хочу отправить загруженный файл с клиента на сервер, а затем сделать запрос с моего сервера к облачным функциям Firebase, которые будут заниматься хранением изображения.
Мой HTML — код для формы выглядит следующим образом:
<div className='LoafGalleryWrap'>
<h1 className='banner'>Illustrious Loafs</h1>
<form>
<label>Add a loaf to the exhibit:
<input type='file' onChange={props.fileSelectedHandler} />
<button onClick={props.fileUploadHandler}>Upload</button>
</label>
</form>
<button onClick={props.toggleDisplayLandingPage}>Back</button>
</div>
Я получаю данные файла в своем приложении следующим способом. В файле console.log я вижу данные файла, которые хочу отправить на свой сервер.
fileUploadHandler(e) {
e.preventDefault();
e.stopPropagation();
let file = this.state.selectedFile;
let formData = new FormData();
formData.append('image', file);
formData.append('name', file.name);
const pic = formData.getAll('image');
console.log(formData)
axios({
url: 'http://localhost:3001/uploadLoaf',
method: 'POST',
data: formData,
headers: { "Content-Type": "multipart/form-data" }
})
.then(respo => console.log(respo))
}
На моем сервере, когда я проверяю тело запроса, там ничего нет. Я выхожу из системы и просто получаю пустой объект. Я пробовал использовать промежуточные программы multer и connect-multipart, но ни одно из них не удалось отобразить данные формы. То, что я делаю, похоже на то, что предлагается в этой статье (https://www.geeksforgeeks.org/file-uploading-in-react-js/), но я не знаю, как получить данные, отправленные в моих формах. Любое руководство очень ценится.
Мой серверный маршрут выглядит следующим образом:
app.post('/uploadLoaf', (req, res) => {
console.log('uploadLoaf endpoint reached');
console.log(req.body);
res.status(201).json('complete')
// axios.post('https://us-central1-sour-loafs.cloudfunctions.net/uploadFile/', 'upload_file', formData, {
// headers: {
// 'Content-Type': 'multipart/form-data'
// }
// })
// .then(result => {
// console.log(result);
// res.send(result);
// })
// .catch(err => {
// console.log(err);
// res.send(err)
// })
});
Ответ №1:
попробуйте заменить имеющуюся у вас функцию axios на эту
axios.post("http://localhost:3001/uploadLoaf", formData, { })
.then(res => { // then print response status
console.log(res.statusText)
})
дайте мне знать, что вы используете в бэкэнде и каков результат работы функции res
Комментарии:
1. Я обновил вопрос, чтобы также показать маршрут моего сервера, я использую Node и Express. В журнале просто отображается произвольный ответ-моя проблема в том, что я не могу получить данные формы при входе в систему
req.body()
Ответ №2:
Мне удалось получить доступ к данным файла FormData с помощью функции загрузки Multer. Мой импорт и маршрут сервера, настроенный таким образом, чтобы я мог получить доступ к данным файла, выглядит следующим образом:
const multer = require("multer");
const upload = multer({
limits:{fileSize: 1000000},
}).single("image");
app.post('/uploadLoaf', (req, res) => {
upload(req, res, (err) => {
if (err) {
res.sendStatus(500);
}
console.log(req.file);
res.send(req.file);
});
});
Теперь я не уверен, как отправить данные этого файла в API так, как ожидает API, получив сообщение об ошибке: «Ошибка: не удалось обработать запросn». Но, по крайней мере, теперь я могу видеть данные из формы.