Загрузка файла HTML5 FormData с помощью RubyOnRails

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

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

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


person Caio Tarifa    schedule 14.09.2012    source источник


Ответы (1)


Вы видели эту проблему? Отправка multipart/formdata с помощью jQuery.ajax

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

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

Исходя из этого, попробуйте:

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

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

person Ian Selby    schedule 19.09.2012
comment
Когда я не использую processData, я получаю незаконный вызов. Но с processData: false я получаю внутреннюю ошибку сервера в rails. - person DGM; 15.09.2016