Мне нужно сохранить содержимое CSV в таблице базы данных с помощью React-Final-Form и Axios.
Я попытался создать простой HTML без использования Final-Form или Axios, и отправка в БД работает нормально. Проблема в том, что я пытаюсь передать содержимое CSV функции, которая будет обрабатывать вызов POST. См. Код ниже:
import React, { Fragment } from "react";
import { Form, Field } from "react-final-form";
import createDecorators from "final-form-focus";
const handleSubmitOnClick = file => {
const url = 'http://localhost:3000/api/v1/invitations/upload';
const data = new FormData();
data.append('file', new File([file], { type: 'text/csv' }));
return axios.post(url, data, {
headers: {
'content-type': 'multipart/form-data'
}
})
.then(response => console.log(response))
.catch(error => console.log(error));
}
const JoinTesting = () =>
<Fragment>
<h1>Join Testing Page</h1>
<Form
onSubmit={handleSubmitOnClick}
decorators={[focusOnError]}
>
{
({
handleSubmit,
values,
submitting,
}) => (
<form onSubmit={handleSubmit} encType="multipart/form-data">
<Field
name='invitation[file]'
placeholder='Upload csv file'
validate={required}
>
{({ input, meta, placeholder }) => (
<div className={meta.active ? 'active' : ''}>
<label>{placeholder}</label>
<input {...input}
type='file'
placeholder={placeholder}
className="join-field-input"
/>
{meta.error && meta.touched && <span className="invalid">{meta.error}</span>}
{meta.valid && meta.dirty && <span className="valid">Great!</span>}
</div>
)}
</Field>
<button
type="submit"
className="join-button"
disabled={submitting}
>
Submit
</button>
<pre>{JSON.stringify(values, 0, 2)}</pre>
</form>
)}
</Form>
</Fragment>
export default JoinTesting;
Если я удалю ВСЕ вышеперечисленное и просто использую этот HTML-код в своем компоненте JoinTesting, он будет работать нормально, но я не смогу обрабатывать ошибки (если таковые имеются).
<form action="http://localhost:3000/api/v1/invitations/upload" method="post" encType="multipart/form-data">
Select CSV to upload:
<input type="file" name="invitation[file]" id="fileToUpload" />
<br></br>
<input type="submit" value="Upload CSV" name="submit" />
</form>
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: файл CSV имеет только 1 простой столбец с последовательностью адресов электронной почты. Это то, что ожидает запрос POST:
Заголовки:
Content-Type: application/json
Accept: application/json
Тело
{
"invitation": {
"file": "Email\[email protected]\[email protected]\[email protected]\[email protected]\n"
}
}
Ответ API, ожидаемый при успешном вызове:
{
"success": true,
"emails": [
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
]
}
Я надеюсь, что кто-то может помочь. Георгий