Загрузка большого файла (> 3 МБ) из ajax-загрузки Valum в Rails завершается ошибкой без вызова контроллера

#ruby-on-rails #file-upload

#ruby-on-rails #загрузка файла

Вопрос:

Я пытаюсь загрузить фотографии с valums на сервер ruby apache amp; nginx passenger, rails 3 ruby 1.9 (1.8 для разработчиков) Обычно файл размером более 3 Мб завершается ошибкой со следующей трассировкой :

#

Запущен POST «/ settings/uploadpict?qqfile=venise.JPGamp; user_id=680251975» для 82.245.125.231 во вторник 05 апреля 23:30:30 0200 2011

Ошибка типа (ожидаемый хэш (полученная строка) для параметра `):

Визуализированный /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/diagnostics. ошибка при восстановлении / компоновке (17,2 мс)

#

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

Что вызывает недоумение, так это то, что мой контроллер даже не вызывается (он начинается с logger.console, который не печатается … ), поэтому я немного беспомощен, чтобы отследить проблему…

Есть какие-нибудь подсказки?

просмотр кода (контроллер никогда не вызывается …)

 //Valum's Ajax File Upload //
function setup_file_upload(){
var uploader = new qq.FileUploader({
// pass the dom node (ex. $(selector)[0] for jQuery users)
element: $("#settings_upload_btn")[0],
// path to server-side upload script
  action: '/settings/uploadpict',
// additional data to send, name-value pairs
params: {
    user_id: <%=@user.fb_id%>
},
// validation    
// ex. ['jpg', 'jpeg', 'png', 'gif'] or []
allowedExtensions: ['jpg', 'jpeg', 'png', 'gif', 'gif', 'bmp'],        
// each file size limit in bytes
// this option isn't supported in all browsers
//sizeLimit: 0, // max size   
//minSizeLimit: 0, // min size

// set to true to output server response to console
debug: false,

// events         
// you can return false to abort submit
onSubmit: function(id, fileName){
    //clean-up the mess....
    $(".qq-upload-list").empty();
},
onProgress: function(id, fileName, loaded, total){},
onComplete: function(id, fileName, responseJSON){
    if (responseJSON["success"] == "false" || responseJSON["success"] == undefined) {
        $(".qq-upload-failed-text").show();
    }else{
        //do the dance
        uploadDone(responseJSON["filename"]);   
    }



},
onCancel: function(id, fileName){},

messages: {
    // error messages, see qq.FileUploaderBasic for content            
},
showMessage: function(message){ alert(message); }
});
}
  

Комментарии:

1. Может быть полезно просмотреть ваш код представления и / или контроллер

2. добавлено, что для main — controller бесполезно, он никогда не вызывается! (в этом вся проблема.. ошибка в моем коде, с которой я могу справиться, но я не могу указать, откуда эта ошибка возникает …)

Ответ №1:

После расследования я нашел обходной путь => ДЕАКТИВИРОВАТЬ XHR !!!

в valums fileuploader .js:

 qq.UploadHandlerXhr.isSupported = function(){
return false;    
};
  

и после этого он работает безупречно, используя устаревший iframe … однако больше нет приятной панели прогресса…

Ответ №2:

нашел это здесь http://developer.appcelerator.com/question/116980/iphone—rails—xhr—undefined-method-tosym-for-nilnilclass

Я обнаружил «проблему», она в исходном коде Rails

Ошибка находится в строке rails/ actionpack-3.0.3/instrumentation.rb (22)

Я не знаю, действительно ли это проблема. Это происходит из-за Titanium.Network.createHTTPClient() не отправляет тип содержимого по умолчанию В моем примере, я не использовал тип содержимого, это вызывает ошибку в rails, я добавил тип содержимого в код //… xhr.open(‘GET’, url, false); xhr.setRequestHeader(‘Content-Type’, ‘application / json’); xhr.send();
/// Теперь это работает, я думаю, что text / plain может быть типом содержимого по умолчанию для Titanium XHR, а не пустым, как сейчас. Я также создал тикет на Rails Issue Tracker https://rails.lighthouseapp.com/projects/8994/tickets/6546-error-sending-empty-content-type-instrumentationrb22