Я могу загружать документы с помощью Axios, но не могу добавить какие-либо метаданные в загружаемый файл. Я сохраняю файл в своей БД, и мне нужно сохранить его с данными из моей формы, такими как DocumentTypeID и т. Д. Вот мой код:
Моя страница реакции, событие, когда файл выбран:
fileUpload(event) {
const { dispatch } = this.props;
var documentDetails = {
matterID: 1,
documentTypeID: 1
}
dispatch(documentActions.add(documentDetails, event));
}
Мое действие:
function add(documentDetails, file) {
let data = new FormData();
let filetoUpload = file.target.files[0];
data.append('file', filetoUpload);
return dispatch => {
dispatch(request());
axios.post('/api/document/add', data, {
headers: {
'Content-Type': 'multipart/form-data',
'Metadata': JSON.stringify(documentDetails)
},
})
.then(
dispatch(success(function () )),
error => dispatch(failure())
);
};
В приведенном выше примере я не могу отправить объект documentDetails на мой контроллер API. Я могу отправить файл, только когда я попробую что-нибудь еще, значения, отправленные в API, будут нулевыми.
Мой контроллер API, который работает, когда я только отправляю файл:
[HttpPost("add")]
public void Add(IFormFile file)
{
if (file != null)
{
DocumentViewModel documentViewModel = new DocumentViewModel();
Document document = new Document();
byte[] p1 = null;
using (var fs1 = file.OpenReadStream())
using (var ms1 = new MemoryStream())
{
fs1.CopyTo(ms1);
p1 = ms1.ToArray();
}
document = documentViewModel.ToDocumentEntity();
document.DocumentType = 1;
document.FileName = "test.txt";
document.Name = "testing";
document.MatterID = 1;
document.DateUploaded = DateTime.Now;
document.IsDeleted = false;
using (LiquidationEntities db = new LiquidationEntities())
{
DocumentRepository documentRepo = new DocumentRepository();
documentRepo.Add(db, document);
}
}
var response = new
{
};
}
Когда я пытаюсь отправить файл и объект, который является моделью представления, оба равны нулю:
[HttpPost("add")]
public void Add([FromBody]DocumentViewModel documentViewModel, IFormFile file)
{
Document document = new Document();
byte[] p1 = null;
using (var fs1 = documentViewModel.FormFile.OpenReadStream())
using (var ms1 = new MemoryStream())
{
fs1.CopyTo(ms1);
p1 = ms1.ToArray();
}
document = documentViewModel.ToDocumentEntity();
document.DocumentType = 1;
document.FileName = "test.txt";
document.Name = "testing";
document.MatterID = 1;
document.DateUploaded = DateTime.Now;
document.IsDeleted = false;
using (LiquidationEntities db = new LiquidationEntities())
{
DocumentRepository documentRepo = new DocumentRepository();
documentRepo.Add(db, document);
}
var response = new
{
};
}
Как видите, я тяжело кодирую детали документа. Как я могу отправить эту информацию вместе с загружаемым файлом? Я пытался добавить его в заголовки, но это не сработало. Я попытался использовать свой сервис вместо вызова Axios из моего действия, и это тоже не сработало, вот этот сервис:
function add(documentDetails, file) {
debugger;
let data = new FormData();
let filetoUpload = file.target.files[0];
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/json'},
body: { 'documentViewModel': documentDetails, 'file': file }
};
var result = fetch(`${process.env.REACT_APP_API_URL}/api/document/add`, requestOptions).then(handleResponse);
return result;
}
Когда я пытаюсь отправить и мою модель представления, и файл, это также не удается. Когда я отправляю только файл, он работает.
Пожалуйста, кто-нибудь может помочь, и дайте мне знать, как я могу добавить метаданные в мой файл ...