【问题标题】:How to save a raw_data photo using paperclip如何使用回形针保存 raw_data 照片
【发布时间】: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


【解决方案1】:

我之前的解决方案的问题是临时文件已经关闭,因此 Paperclip 不能再使用了。下面的解决方案对我有用。这是 IMO 最干净的方式,并且(根据文档)确保您的临时文件在使用后被删除。

将以下方法添加到您的 User 模型中:

def set_picture(data)
  temp_file = Tempfile.new(['temp', '.jpg'], :encoding => 'ascii-8bit')

  begin
    temp_file.write(data)
    self.picture = temp_file # assumes has_attached_file :picture
  ensure
    temp_file.close
    temp_file.unlink
  end
end

控制器:

current_user.set_picture(request.raw_post)
current_user.save

不要忘记在 User 模型文件的顶部添加 require 'tempfile'

【讨论】:

  • 然后你必须破解 Paperclip 来做你想做的事,或者使用一个不同的文件处理库,它不需要文件系统上的文件。 (Carrierwave?)无论如何,如果您担心必须清理旧文件,此解决方案是有效的,因为垃圾收集器会为您完成。您对临时文件还有哪些其他顾虑?
  • 顺便说一句,正常的文件上传会以与此代码类似的方式创建一个临时文件。
  • 让我尝试重现这一点。只是错误没有任何线索。只是为了确保:您的“丑陋解决方案”有效吗?它生成了 Paperclip 可以使用的有效 jpeg 图像?
  • 问题是临时文件已关闭,无法再与 Paperclip 一起使用。我更新了我的答案。上面的解决方案对我有用。
  • 太棒了,真的很优雅。谢谢你,米莎
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
相关资源
最近更新 更多