6

我正在使用 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 而无需制作临时文件。有什么优雅的想法或解决方案吗?

丑陋的解决方案(需要临时文件)

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吗?

4

1 回答 1

14

我之前的解决方案的问题是临时文件已经关闭,因此 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

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

于 2012-10-11T02:28:11.197 回答