Carrierwave + 文件上传器

Posted

技术标签:

【中文标题】Carrierwave + 文件上传器【英文标题】:Carrierwave + File Uploader 【发布时间】:2012-02-28 21:52:42 【问题描述】:

我正在尝试弄清楚如何正确设置 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());
      
    );
);

当我选择一个文件时,它会启动脚本并调用我的应用程序。那是我不知道如何处理的。

载波

我有一个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 的 wiki 上的一位 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 上有一个用于 CarrierWave 的 suggestion,但我也想不出任何东西。 CarrierwaveStringIO 在我看来并不存在。

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

其他参考链接:

base64 image with Carrierwave - SO Question File uploader's notes on server side info - 看来我需要处理两种获取文件的方法。

【问题讨论】:

你能分享一下你是如何使用uploadify的吗? 这是我最终为uploadify部分所做的。这有点脱离上下文,所以我不确定它会有多大帮助。 Gist 感谢 Ryan,我希望 flash 不会给 rails 带来任何问题 【参考方案1】:

我正在使用rack-raw-upload gem

然后在我的控制器中我正在执行以下操作:

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

【讨论】:

感谢您的帮助。我最终选择了 Uploadify。

以上是关于Carrierwave + 文件上传器的主要内容,如果未能解决你的问题,请参考以下文章

使用Carrierwave上传器测试模型

根据另一个模型的属性 - RAILS,为一个模型使用不同的CarrierWave上传器

Carrierwave、MiniMagick 和调整图像大小

Rails carrierwave 和 cloudinary 多文件上传

如何通过 JSON API 通过 Carrierwave 上传文件?

Rails 4使用carrierwave上传多个图像或文件