#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