web-dev-qa-db-ja.com

Paperclip / Ruby on Rails)でアップロードされたファイルの生のコンテンツにどのようにアクセスしますか?

ファイルのアップロードにペーパークリップ/ S3を使用しています。テキストのようなファイルをアップロードします(.txtではありませんが、基本的には.txtです)。ショーコントローラーで、アップロードされたファイルのコンテンツを取得できるようにしたいのですが、コンテンツをその属性の1つとして表示しません。ここで何ができますか?

attachment_file_name: "test.md", attachment_content_type: "application/octet-stream", attachment_file_size: 58, attachment_updated_at: "2011-06-22 01:01:40"

PS-すべてのペーパークリップのチュートリアルはテキストファイルではなく画像に関するもののようです。

26
Geoff

添付ファイルの未加工のコンテンツにアクセスする方法は次のとおりです。

class Document

  has_attached_file :revision

  def revision_contents
    revision.copy_to_local_file.read
  end

end

Paperclip構成オプションとあらゆる種類のエラー処理を省略していることに注意してください。

4
Jon M.

Paperclip 3.0.1では、ローカルファイルシステムへの書き込み(およびローカルファイルシステムからの削除)を必要としないio_adapterを使用できます。

Paperclip.io_adapters.for(attachment.file).read
87
jwadsack

@ jon-mの回答は、ペーパークリップの最新の変更を反映するように更新する必要があります。これを機能させるには、次のように変更する必要があります。

class Document

  has_attached_file :revision

  def revision_contents(path = 'tmp/tmp.any')
    revision.copy_to_local_file :original, path
    File.open(path).read
  end
end

Paperclip.io_adapters.forメソッドを使用して言及された@jwadsa​​ckが同じことを達成し、このIMHOを実行するためのより良い、よりクリーンな方法のように思われるように、少し複雑です。

5
edgarsilva

ファイルにアクセスするには、pathメソッドを使用できます。csv_file.pathhttp://rdoc.info/gems/Paperclip/Paperclip/Attachment#path-instance_method

これは、たとえばCSVリーダーと一緒に使用できます。

5
Shaun McDonald

添付ファイルはすでにIOStreamから継承しています。 http://rdoc.info/github/thoughtbot/Paperclip/master/Paperclip/Attachment

したがって、_"#{attachment}"_または<% RDiscount.new(attachment).to_html %>またはsend_data(attachment)である必要があります。ただし、データを表示したかった。

1
Tim Snowhite

ファイルを表示する前に、ファイルの内容を(Rubys File.openを使用して)変数にロードする必要があります。アプリが頻繁に使用される場合、これはコストのかかる操作になる可能性があるため、ファイルの内容を読み取り、アップロード後にデータベースのテキスト列に配置することをお勧めします。

1
robzolkos