Я пытаюсь сделать простую загрузку файлов с помощью redux-saga и formik, которая заботится о моих формах.
Сервер продолжает возвращать 400 error
(неверный ввод), моему серверу нужен объект formData
со свойством file
.
Это моя форма с использованием Formik:
<Formik
initialValues={{ file: null }}
validationSchema={CreateWorkspaceSchema}
onSubmit={(values: FormikValues, { resetForm }: FormikActions<FormikValues>) => {
resetForm({})
onSubmit(values)
}}
>
{({
values,
errors,
touched,
handleChange,
handleSubmit,
setFieldValue
}) =>
<Modal
title="Create a workspace"
visible={showModal}
onOk={handleSubmit}
okButtonProps={{ htmlType: "submit" }}
onCancel={onShowModal}
okText='Create'
>
<Spin spinning={status === ProgressStatus.InProgress}>
{message ? <Alert type="error" closable message={message} showIcon style={{ marginBottom: "10px" }} /> : null}
<Form onSubmit={handleSubmit}>
<Upload beforeUpload={() => false} multiple={false} name="file" listType="picture" onChange={(event) => {
setFieldValue("file", event.fileList[0]);
}}>
<Button>
<Icon type="upload" /> Upload image
</Button>
</Upload>
</Form>
</Spin>
</Modal>
}
</Formik>
Я использую пользовательский компонент Upload из Ant Design onChange
запускается при загрузке нового файла и правильно добавляется в formikValues
My onSubmit
заботится о запуске моего redux-saga
действия:
onCreateWorkspace = (values: FormikValues) => {
const { user, createWorkspace } = this.props;
createWorkspace(Object.assign(
values,
{
owner: `api/users/${user.id}`
}
) as CreateWorkspaceValues)
}
Моя сага:
const formData = new FormData();
formData.append('file', action.payload.file)
const fileResponse = yield call(
fetch,
`${api.url}/api/media_objects`,
{
method: 'POST',
body: formData
}
);
return console.log(fileResponse);
Я пыталсядобавив следующий заголовок:
headers: { 'content-type': 'multipart/form-data' }
Но ошибка остается прежней.
Я попытался сделать то же самое в Postman, чтобы увидеть, было ли что-то не так с моим внутренним сервером, но загрузка файлав почтальоне работает как положено.Моя загрузка в почтальоне выглядит следующим образом:
Что мне здесь не хватает?