2014-09-12 2 views
1

Я пытаюсь загрузить файл с помощью Ajax на сервер Nodejs.Ошибка загрузки файла

Ajax код:

var url = 'http://<ip:port>/upload/'; 
var formValues = $("#files").get(0).files; 
$.ajax({ 
    url: url, 
    type: 'POST', 
    data: formValues, 
    processData: false, 
    cache: false, 
    beforeSend: function(xhr) { 
     xhr.setRequestHeader('content-type', 'multipart/form-data'); 
    }, 
    success: function (data) { 
     console.log("Store details: %j", data); 
     Backbone.history.navigate('store'); 
     window.location.reload(); 
    } 
}); 

Я использую Busboy в узле сервера и он дает мне эту ошибку, когда я пытаюсь разобрать заголовки запроса для инициализации объекта Busboy.

Error: Multipart: Boundary not found 
at new Multipart (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/types/multipart.js:58:11) 
at Multipart (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/types/multipart.js:26:12) 
at Busboy.parseHeaders (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/main.js:62:22) 
at new Busboy (/home/ubuntu/MoojicDashboard/node_modules/busboy/lib/main.js:21:10) 

Но если я не установить тип содержимого для мультисекционного/форм-данных запрос отброшен помощник официанта.

Я даже пробовал использовать пакет multer но и дать мне ту же ошибку. (Позже я узнал, что это было построено на помощника официанта.)

Я даже попытался установить CONTENTTYPE ложь.

$.ajax({ 
      url: url, 
      type: 'POST', 
      data: formValues, 
      processData: false, 
      cache: false, 
      contentType: false, 
      success: function (data) { 
       console.log("Store details: %j", data); 
       Backbone.history.navigate('store'); 
       window.location.reload(); 
      } 
     }); 

, чтобы заставить JQuery не устанавливать тип содержимого по умолчанию, но он тоже не работал.

Настройка contentType: «multipart/form-data» также не работает и дает мне такую ​​же ошибку «Multipart: Boundary not found». Поэтому любой может помочь мне выйти из этой ошибки.

ответ

2

Вы должны использовать API FormData вместо того, чтобы пытаться сделать это самостоятельно. Затем, когда вы передаете экземпляр FormData в $.ajax(), он автоматически установит для вас правильные заголовки. Here is an example.

1

Лучше использовать FormData с MIME-типом, установленным на 'multipart/form-data'. Ключ/значения из FormData помещаются в форме запроса и разделяются на '&'. Это исправлено и известно серверу.

Пример: category=laptop&brand=apple&price=150000,250000

Но с файлами это не так, поэтому мы должны обеспечить некоторый путь, так что код на сервере может отделить из файла от других данных.

Для этого мы предоставляем граничное значение, которое знаменует начало и конец данных файла.

Использование contentType: 'multipart/form-data;boundary=abc'.

Очевидно, что ошибка показывает «Multipart: Граница не найден» и, следовательно, граница отсутствует

Обеспечение границы решает эту проблему.

Более подробно см: https://stackoverflow.com/a/20321259

И если это не сработает, то попробуйте установить contentType: false

Смежные вопросы