Carrierwave + File Uploader
Я пытаюсь выяснить, как правильно настроить Carrierwave, чтобы иметь возможность обрабатывать файл, отправляемый через File Uploader.
Загрузчик файлов
Я прикрепил fileuploader.js
а также fileuploader.css
к моему конвейеру активов (rails 3.2.0) и иметь следующий HTML:
<div id="file-uploader">
<noscript>
<p>Please enable JavaScript to use file uploader.</p>
<!-- or put a simple form for upload here -->
</noscript>
</div>
И JavaScript
$(document).ready(function(){
var uploader = new qq.FileUploader({
// pass the dom node (ex. $(selector)[0] for jQuery users)
element: $('#file-uploader')[0],
// path to server-side upload script
action: '/photos',
debug: true,
params: {
authenticity_token: "<%= form_authenticity_token.to_s %>"
},
onComplete: function(id, fileName, responseJSON){
alert(responseJSON.toString());
}
});
});
Когда я выбираю файл, он запускает скрипт и вызывается мое приложение. Это то, что я не знаю, как справиться.
Carrierwave
у меня есть Photo
модель, которая имеет mount_uploader :image, ImageUploader
, Поэтому в PhotoController
Я имею:
def create
io = AppSpecificStringIO.new(request.raw_post,params[:qqfile])
@photo = Photo.new(:image => io)
if @photo.save
respond_to do |format|
format.js { render :josn => @photo.to_json(:methods => :success, :only => [:id, :image]) }
end
else
respond_to do |format|
format.js { render :josn => {:success=>false} }
end
end
end
Парам имеет только qqfile
который является именем файла. я узнал что request.raw_post
есть данные для изображения. Но я не знаю, какой это формат (64-битный или нет). Я пытался найти любой ресурс на эту тему и пробовал что угодно. Один из источников в вики Carrierwave предложил использовать класс AppSpecificStringIO.
class AppSpecificStringIO < StringIO
attr_accessor :filepath
def initialize(*args)
super(*args[1..-1])
@filepath = args[0]
end
def original_filename
File.basename(filepath)
end
end
На вики File Uploader есть предложение для CarrierWave, но я тоже ничего не могу понять. CarrierwaveStringIO
не существует, насколько я могу видеть.
Я просто хочу получить решение Ajax для загрузки изображений в Carrierwave. Спасибо всем, кто может мне помочь.
Другие ссылки для справки:
- Изображение base64 с Carrierwave - ТАК вопрос
- Примечания к загрузчику файла о серверной информации - похоже, мне нужно обработать два способа получить файл.
1 ответ
Я использую гем Rack-Raw-Upload
а затем в моем контроллере я делаю следующее:
def create
if params[:qqfile]
## IE acts differently
file = params[:qqfile].is_a?(ActionDispatch::Http::UploadedFile) ? params[:qqfile] : params[:file]
@attachment.asset = file
xhr_create
else
super
end
end
def xhr_create
if @attachment.save
render :json => { success: true }
else
render :json => @attachment.errors.to_json
end
end
и в application.rb
config.middleware.use 'Rack::RawUpload', :paths => ['/attachments']