Я хотел бы добавить вложение, я использую .net core 2.0 и реагирую (избыточность).
На бэкэнде у меня есть ORM db EF. Это модель:
public byte[] Attachment { get; set; }
Мое вложение содержится в байте [] на серверной части.
Это мой код React:
Функция:
fileSelectedHandler = event => {
this.setState({
attachment: event.target.files[0]
})
}
Конструктор:
this.state = {
attachment: null
}
onSubmit:
const fd = new FormData();
const test = fd.append('attachment', this.state.attachment,
this.state.attachment.name);
const reportData = {
attachment: test
};
this.props.addReport(reportData, url);
К сожалению, это не работает, я понятия не имею, чтобы решить эту проблему.
РЕШЕНИЕ:
fileSelectedHandler = event => {
let reader = new FileReader();
reader.readAsDataURL(event.target.files[0]);
if(event.target.files[0].size < 2097152){ // max 2mb files
reader.onloadend = () => {
this.setState({
attachment : reader.result.split(';base64,')[1]
})
};
}
else{
tost.error('Plik powinien być mniejszy niż 2mb.'); // tost.error for file should be smaller than 2mb
reader.onloadend = () => {
this.setState({
attachment : null
})
};
}
ReportAction:
// Add Report
export const addReport = (postData, prevUrl) => dispatch => {
const config = {
headers: {
'enctype' : 'multipart/form-data' // it's important!
}
}
axios
.post(`${API_ROUTE}/api/Reports`, postData, config)
.then( () => {
const toastrOptions = {
timeOut: 2000
}
if(prevUrl === "/reports"){
dispatch(getReports())
}
tost.success('Pomyślnie dodano raport', toastrOptions);
})
.catch(err => {
tost.error(err.response.data.errorMessage);
dispatch({
type: GET_ERRORS,
payload: err.response.data
})}
);
};
Бэкэнд-контроллер:
[AllowAnonymous]
[HttpPost]
public async Task<IActionResult> Add([FromBody] ReportDto reportDto)
{
var report = _mapper.Map<ReportDto, Report>(reportDto);
var addedReport = await _service.AddReport(report);
var uri = Request.PathBase.Value.ToString();
return Created(uri, addedReport);
}
ReportDto - это те же реквизиты, что и выше.