#javascript #reactjs #file-upload #axios #multipartform-data
#javascript #reactjs #загрузка файла #axios #multipartform-данные
Вопрос:
Я пытаюсь загрузить изображение, используя Axios внутри объекта. Я могу получить файл с помощью new FormData()
и поместить его в объект, но отправка изображения пуста. Как мне загрузить файл в объект в сочетании с другими данными JSON?
import React, { useState } from 'react';
import axios from 'axios';
function UploadFiles() {
const [submitFile, setSubmitFile] = useState({});
const handleChange = e => {
setSubmitFile(e.target.files[0]);
};
const handleSubmit = () => {
const formData = new FormData();
formData.append('document', submitFile);
formData.append('Answer_name', 'image');
formData.append('Document', true);
formData.append('Answer', 'Got some data');
console.log(submitData) // I get formData data
const submitData = {
UUID_Formulier: '117F994F-F803-7249-91E9-EE1E7B691DFF',
answers: [formData], // this will be an empty object on calling axios.post
};
axios
.post('/submit', submitData, {
headers: {
'Content-Type': 'multipart/form-data',
},
})
.then(() => {
console.log('success');
})
.catch(() => {
console.log('failed error');
});
};
return (
<div>
<input type="file" name="image" onChange={handleChange} />
<button onClick={handleSubmit}>Submit</button>
</div>
);
}
Изображение должно быть помещено в массив ответов. Когда я помещаю FormData в массив ответов, это пустой объект. Как я могу поместить файл FormData в объект или массив JSON, а затем отправить все?
Использование обозначения в квадратных скобках создает не массив, а строки, как показано ниже.
Ответ №1:
Все ваши данные должны быть добавлены в объект FormData, чтобы получить данные в виде массива, вы можете попробовать использовать квадратные скобки.
const formData = new FormData();
formData.append('UUID_Formulier', '117F994F-F803-7249-91E9-EE1E7B691DFF');
formData.append('answers[0][document]', submitFile);
formData.append('answers[0][Answer_name]', 'image');
formData.append('answers[0][Document]', true);
formData.append('answers[0][Answer]', 'Got some data');
console.log(formData) // I get formData data
axios
.post('/submit', formData, {
headers: {
'Content-Type': 'multipart/form-data',
},
})
.then(() => {
console.log('success');
})
.catch(() => {
console.log('failed error');
});
};
Комментарии:
1. Спасибо за подсказки @Musa, к сожалению, обозначение в квадратных скобках не создает массивы. Проверьте обновленный вопрос на скриншоте ответа данных, отправленного на сервер.
2. Что вы используете на стороне сервера?
3. Серверная часть — laravel.
4. Ну, с PHP поля файлов отделены от текстовых полей, поэтому я не думаю, что вы сможете достичь желаемой структуры с помощью полей файлов
Ответ №2:
Решаемая проблема путем преобразования файла в строку base64.
function getBase64(file) {
return new Promise(function(resolve, reject) {
const reader = new FileReader();
reader.onload = function() {
resolve(reader.result);
};
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
const [form, setForm] = useState([]);
const fileFound = e.target.type === 'file' amp;amp; e.target.files[0];
const promise = fileFound amp;amp; getBase64(fileFound);
promise.then(function(result) {
setForm([
...form,
{
UUID_Answer: 'image_name,
Answer: '',
Document: true,
Document_Upload: result,
},
]);
});
const submitData = {
UUID_Formulier: '117F994F-F803-7249-91E9-EE1E7B691DFF',
answers: form,
};
axios
.post('/submit', submitData)
.then(() => {
console.log('success');
})
.catch(() => {
console.log('failed error');
});