2017-01-22 13 views
0

Я создаю простое приложение с использованием Sails.js. В основном это создает новый элемент, а затем сохраняет его в базе данных и загружает изображение на S3.Загрузка файла в веб-приложение EC2 из веб-приложения

Что происходит: Когда я запускаю свое приложение на своем локальном компьютере, он ведет себя хорошо. У req.body есть содержимое, а файл req.file ('item-image') не пуст. Теперь я запускаю его на EC2, и проблема в том, что req.body - это просто пустой объект, но req.file ('item-image') не пуст. Я пробовал различные сценарии отладки, увидеть их ниже:

  1. Если удалить ENCTYPE = «многослойную/форм-данных» (я знаю, что это необходимо для загрузки файлов, просто пытается), я получаю REQ .body, который я ожидаю, но, как и ожидалось, req.file ('item-image') пуст.

  2. Я положил обратно enctype = "multipart/form-data", а затем попытался отправить запрос без файла, я получаю ожидаемый объект req.body.

  3. Я включил изображение по моей просьбе, объект 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">&times;</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); 
      }); 
     }); 
    }); 
}, 

Спасибо!

+0

Вы подключили роль IAM с разрешением S3 при запуске экземпляра EC2? –

+0

Да, для этого достаточно разрешения для загрузки и доступа к файлам S3 – bless1204

ответ

0

Я нашел ответ здесь https://github.com/balderdashy/sails/issues/2508

Видимо, sails.js использует шкипер и чуток по порядку ввода. Я просто поместил часть файла в конец, и теперь он работает.

Я просто смущен, почему он работает на моем местном, а не на моем сервере ec2.