2

我阅读了这篇关于在 rails3 应用程序中使用 Paperclip 从网络摄像头捕获图片的精彩文章。

我正在尝试将其转换为使用 Carrierwave(我在将共享相同图像的其他应用程序上使用它,所以我希望保持一致)。

我正在努力解决的是如何让 Carrierwave 接受来自jpegcam的闪存图像捕获的文件。似乎 Paperclip 更面向文件,而 Carrierwave 更面向对象。

这是我正在尝试的:

我有一个安装了载波上传器的模型:

class Individual < ActiveRecord::Base

  mount_uploader :picture, PictureUploader

在视图中(“编辑”视图):

#webcam
  = embed{:id => 'webcam_movie'}... (the embedded flash)...

= submit_tag "Take picture", :onclick => 'webcam.snap();'

= form_for @individual, :html => {:multipart => true} do |f|
  = f.text_field :firstname
  = f.text_field :lastname
  = f.file_field :picture
  = f.submit

= content_for :javascripts do
  :javascript
    function upload_complete(msg) {
       if (msg) {
           ????
     } else {
       alert('An error occured');
       webcam.reset();
     }
   }
   webcam.set_hook('onComplete', 'upload_complete');

我的问题是 Carrierwave 并没有真正的“上传”功能,而是使用模型对象。所以我不确定在控制器中放什么来让它接受文件。以及如何在javascript中处理回调。(我尝试了一些我不好意思在这里重现的东西。将图像对象拿到控制器,但不知道如何处理它)

谁能帮我吗?谢谢。

4

1 回答 1

3

我最终用一个巨大的黑客解决了这个问题。

在我的控制器中,我做了:

def upload
  @individual = Individual.find(params[:individual_id])
  File.open(upload_path, 'w:ASCII-8BIT') do |f|
    f.write request.raw_post
  end
  @individual.picture = File.open(upload_path)
  if @individual.save!
    render :text => "ok"
  end
end

private

def upload_path # is used in upload and create
  file_name = 'temp.jpg'
  File.join(::Rails.root.to_s, 'public', 'uploads', file_name)
end

所以我将图像写到一个文件中,然后carrierwave 会读入该文件。(当然,carrierwave 也会制作文件的临时副本)。

这很丑陋,可能会冒犯所有 Rails 之神,但它确实有效。

我在carrierwave列表上询问了我是否可以删除临时文件位并以某种方式将“request.raw_post”读入上传器对象,但尚不清楚我是否可以。

于 2011-05-20T15:57:55.060 回答