2012-09-14 3 views
7

Я использую этот скрипт для загрузки файла (один за другим) с помощью HTML5 FormData в приложении Rails 3.2.8.HTML5 Загрузка файла FormData с RubyOnRails

http://jsfiddle.net/RamPr/

$('.uploader input:file').on('change', function() { 
    $this = $(this); 

    $('.alert').remove(); 

    $.each($this[0].files, function(key, file) { 
    $('.files').append('<li>' + file.name + '</li>'); 

    data = new FormData(); 
    data.append(file.name, file); 

    $.ajax({ 
     url: $('.uploader').attr('action'), 
     contentType: 'multipart/form-data', 
     type: 'POST', 
     dataType: 'json', 
     data: data, 
     processData: false 
    }); 
    }); 
}); 

Но когда я загрузить файл, я получаю эту ошибку в консоли:

webrick/server.rb:191:in `block in start_thread' ERROR ArgumentError: invalid %-encoding ("filename.jpeg" Content-Type: image/jpeg 

Как я могу решить эту ошибку?

ответ

16

Вы видели эту проблему? Sending multipart/formdata with jQuery.ajax

Похоже, вы используете jQuery, добавляя заголовки типа контента, что приводит к отсутствию граничной строки. Из приведенного выше связанного вопроса:

Это необходимо, чтобы установить параметр contentType в false, заставляя JQuery не добавить заголовок Content-Type для вас, в противном случае, граница строка будет отсутствовать из него. Кроме того, вы должны оставить флаг processData равным false, в противном случае jQuery попытается преобразовать вашу FormData в строку, которая не удастся.

Исходя из этого, дать этому попытку:

$.ajax({ 
    url: $('.uploader').attr('action'), 
    contentType: false, 
    cache: false, 
    processData: false, 
    type: 'POST', 
    dataType: 'json', 
    data: data 
}); 

Я не пробовал это сам, но я подозреваю, что это может быть дроидов вы ищете :)

+0

Когда я не используйте processData, я получаю незаконный вызов. Но с processData: false, я получаю внутреннюю ошибку сервера в рельсах. – DGM