【发布时间】:2012-10-09 01:41:55
【问题描述】:
我正在使用 jpegcam 来允许用户拍摄网络摄像头照片以设置为他们的个人资料照片。这个库最终将原始数据发布到我在我的 rails 控制器中获得的服务器,如下所示:
def ajax_photo_upload
# Rails.logger.info request.raw_post
@user = User.find(current_user.id)
@user.picture = File.new(request.raw_post)
当您尝试保存 request.raw_post 时,这不起作用并且回形针/导轨失败。
Errno::ENOENT (No such file or directory - ????JFIF???
我见过制作临时文件的解决方案,但我很想知道是否有办法让 Paperclip 自动保存 request.raw_post 而无需制作临时文件。有什么优雅的想法或解决方案吗?
UGLY 解决方案(需要临时文件)
class ApiV1::UsersController < ApiV1::APIController
def create
File.open(upload_path, 'w:ASCII-8BIT') do |f|
f.write request.raw_post
end
current_user.photo = File.open(upload_path)
end
private
def upload_path # is used in upload and create
file_name = 'temp.jpg'
File.join(::Rails.root.to_s, 'public', 'temp', file_name)
end
end
这很难看,因为它需要在服务器上保存一个临时文件。关于如何在没有需要保存的临时文件的情况下实现这一点的提示?可以用StringIO吗?
【问题讨论】:
-
您确实意识到使用文件系统是一种完全有效的做事方式,对吧?事实上,unix 系统几乎完全基于 FileSystem,这就是 /dev/null 存在的全部意义所在。我对此解决方案的一个更有效的担忧是它容易受到竞争条件的影响。
-
我确定它有效但创建一个文件意味着我需要一个 cron 作业来清理删除所有临时文件,如果不这样做可能会导致归档 HD 并使服务器崩溃。为什么还要担心一件事?我对优雅地解决这个问题非常感兴趣,不需要临时文件。运动部件更少?
-
@AnApprentice,带有
Tempfile类的旧文件由垃圾收集器清理。请参阅下面的答案。
标签: ruby-on-rails ruby-on-rails-3 paperclip