我在rails3应用程序中使用Paperclip阅读this精彩的文章,以便从网络摄像头中捕捉图片。
我正在尝试将其转换为使用Carrierwave(我在其他应用程序上使用它们将共享相同的图像,因此我希望保持一致)。
我正在努力解决的问题是如何让Carrierwave接受来自jpegcam的flash图像捕获的文件。似乎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中处理回调。 (我尝试了几件让我很尴尬的事情,让我在这里重现。把图像对象带到控制器上,但无法弄清楚如何处理它)
任何人都可以帮助我吗?感谢。
答案 0 :(得分: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
所以我将imiage写入一个文件,然后载波读入。(当然,carrierwave也会制作文件的临时副本)。
这非常难看,可能冒犯了所有的Rails Gods,但它确实有效。
我在carrierwave列表上问了一个问题,我是否可以删除临时文件位,不知何故只是将“request.raw_post”读入上传器对象,但我不清楚它是否可以。