Carrierwave +文件上传器

时间:2012-02-28 21:52:42

标签: ruby-on-rails-3 carrierwave file-upload

我正在尝试弄清楚如何正确设置Carrierwave以便能够处理通过File Uploader发送的文件。

文件上传器

我已将fileuploader.jsfileuploader.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

param只有qqfile这是文件名。我发现request.raw_post有图像的数据。但我不知道它是什么格式(是64Bit还是不是)。我一直试图在这个问题上找到我可以找到的任何资源并尝试任何东西。 Carrierwave维基上的一个source建议使用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的wiki上有一个suggestion用于CarrierWave,但我也无法找到任何东西。就我所见,CarrierwaveStringIO并不存在。

我只想获得一个将图像上传到Carrierwave的ajax解决方案。感谢能帮助我的任何人。

其他参考链接:

1 个答案:

答案 0 :(得分:3)

我正在使用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']

Here is a nice writeup