Я изо всех сил пытался найти решение, чтобы загрузить изображение и сохранить его в базе данных.
Опробовал их все: Dropzone, Reaction-Dropzone, Reaction-Uploader и т. Д. c .....
API BackEnd ожидает этого:
{
"course": {
"title": "Hic et velit sed.",
"subtitle": "Omnis quibusdam illum itaque.",
"description": "Et ullam ipsum. Illum dolor odit. Id veritatis ducimus.",
"end_date": "2020-02-01",
"attachment_attributes": {
"file": {
--- here the uploaded data file ---
}
}
}
}
Мой компонент теперь записывается только с 1 типом ввода = файл, чтобы ускорить это тестирование , Требования API, такие как title, subtitle et c., Будут жестко закодированы.
Здесь компонент:
import React, { Component } from 'react';
import api from '../../../../helpers/API';
class Uploader extends Component {
constructor(props) {
super(props);
this.state = {
selectedFile: null
}
}
onChangeHandler = event => {
this.setState({
selectedFile: event.target.files[0],
loaded: 0,
})
}
onClickHandler = () => {
** HARDCODED API REQUIREMENT**
const body = "course": {
"title": "Hic et velit sed.",
"subtitle": "Omnis quibusdam illum itaque.",
"description": "Et ullam ipsum. Illum dolor odit. Id veritatis ducimus.",
"end_date": "2020-02-01",
"attachment_attributes": {
"file": {
--- here the uploaded file data ---
}
}
}
** THIS SHOULD HANDLE THE UPLOADED FILE DATA FORMAT **
const data = new FormData()
data.append('file', this.state.selectedFile)
return api
.post("http://localhost:3000/api/v1/files", ??????). <— DATA or BODY?
.then(res => {
console.log(res.statusText)
})
.catch(res => console.log('error ==> ', res))
}
render() {
return (
<>
<div>
<label>Upload Your File </label>
<input
type="file"
multiple onChange={this.onChangeHandler}/>
</div>
<button type="button" className="btn btn-success btn-block" onClick={this.onClickHandler}>Upload</button>
</>
)
}
}
export default Uploader
Issue
Если я передаю DATA в вызове API, загруженный файл хорошо сохраняется в разделе Browser > Network > Header > Data Form
в виде файла: двоичный файл
И это хорошо.
Но мне нужно передать загруженный файл как часть моего объекта BODY. Итак, ниже то, что я сделал, но возвращается пустым:
onClickHandler = () => {
const data = new FormData()
data.append('file', this.state.selectedFile)
const body = {
"course": {
"title": "Hic et velit sed.",
"subtitle": "Omnis quibusdam illum itaque.",
"description": "Et ullam ipsum. Illum dolor odit. Id veritatis ducimus.",
"end_date": "2020-02-01",
"attachment_attributes": {
"file": data <-- trying to pass the uploaded DataForm here
}
}
}
return api
.post("http://localhost:3000/api/v1/files", body)
.then(res => {
console.log(res.statusText)
})
.catch(res => console.log('error ==> ', res))
}
К сожалению, я получаю 422 error
, {"errors":{"attachment.file":["blank"]}}
Любая помощь очень ценится. Спасибо
Джоу