6

私はjpegcamを使用して、ユーザーがWebカメラの写真を撮ってプロフィール写真として設定できるようにしています。このライブラリは、次のように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 に答える