Я создаю простое приложение с использованием Sails.js. В основном это создает новый элемент, а затем сохраняет его в базе данных и загружает изображение на S3.Загрузка файла в веб-приложение EC2 из веб-приложения
Что происходит: Когда я запускаю свое приложение на своем локальном компьютере, он ведет себя хорошо. У req.body есть содержимое, а файл req.file ('item-image') не пуст. Теперь я запускаю его на EC2, и проблема в том, что req.body - это просто пустой объект, но req.file ('item-image') не пуст. Я пробовал различные сценарии отладки, увидеть их ниже:
Если удалить ENCTYPE = «многослойную/форм-данных» (я знаю, что это необходимо для загрузки файлов, просто пытается), я получаю REQ .body, который я ожидаю, но, как и ожидалось, req.file ('item-image') пуст.
Я положил обратно enctype = "multipart/form-data", а затем попытался отправить запрос без файла, я получаю ожидаемый объект req.body.
Я включил изображение по моей просьбе, объект req.body пуст, но req.file ('item-image') не является.
Самая странная часть, когда я отправляю свой запрос через почтальона, все ведет себя так, как ожидалось. Я действительно потерял сейчас, см мой код ниже:
create_event.ejs
<form action=<%= event.createUrl %> method="POST" id="form-item" enctype="multipart/form-data">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="blue bigger">Please fill the following form fields</h4>
</div>
<div class="modal-body overflow-visible">
<div class="row">
<div class="col-xs-12 col-sm-5">
<div class="space"></div>
<input type="file" name="item-image"/>
</div>
<div class="col-xs-12 col-sm-7">
<div class="form-group">
<label for="form-field-username">Name</label>
<div>
<input class="input-large" type="text" id="form-field-username" placeholder="Item Name" name="item-name" />
</div>
</div>
<div class="space-4"></div>
<div class="form-group">
<label for="form-field-username">Description</label>
<div>
<input class="input-large" type="text" id="form-field-username" placeholder="Item Description" name="item-description"/>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-sm" data-dismiss="modal">
<i class="icon-remove"></i>
Cancel
</button>
<button class="btn btn-sm btn-primary" id="save-item">
<i class="icon-ok"></i>
Save
</button>
</div>
</div>
</div>
</form>
create_event.js
$('#save-item').on('click', function(e){
var response = confirm('Are you sure you want to continue saving this item?');
if(response == true) {
$('#form-item').submit();
}
});
AdminController.js
createItem: function(req, res){
console.log('Saving..');
console.log(req.body);
var eventId = req.path.split('/')[4];
req.file('item-image').upload(function callback(error, uploadedFile){
if(error) {
console.log(error);
return res.serverError();
}
console.log(uploadedFile);
s3Helper.upload(uploadedFile[0], function(error, data){
if(error) {
return res.serverError();
}
var item = {
ITEM_ID: uuid.v1(),
EVENT_ID: req.path.split('/')[4],
NAME: req.body['item-name'],
DESCRIPTION: req.body['item-description'],
IMAGE_URL: data.Location
}
EventItem.create(item, function(error, data){
if(error) {
console.log(error);
return res.serverError();
}
console.log('Successfully saved data: ');
console.log(data);
return res.redirect('/admin/events/' + eventId);
});
});
});
},
Спасибо!
Вы подключили роль IAM с разрешением S3 при запуске экземпляра EC2? –
Да, для этого достаточно разрешения для загрузки и доступа к файлам S3 – bless1204