ファイルのアップロードにペーパークリップ/ 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-すべてのペーパークリップのチュートリアルはテキストファイルではなく画像に関するもののようです。
添付ファイルの未加工のコンテンツにアクセスする方法は次のとおりです。
class Document
has_attached_file :revision
def revision_contents
revision.copy_to_local_file.read
end
end
Paperclip構成オプションとあらゆる種類のエラー処理を省略していることに注意してください。
Paperclip 3.0.1では、ローカルファイルシステムへの書き込み(およびローカルファイルシステムからの削除)を必要としないio_adapter
を使用できます。
Paperclip.io_adapters.for(attachment.file).read
@ 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
メソッドを使用して言及された@jwadsackが同じことを達成し、このIMHOを実行するためのより良い、よりクリーンな方法のように思われるように、少し複雑です。
ファイルにアクセスするには、pathメソッドを使用できます。csv_file.path
http://rdoc.info/gems/Paperclip/Paperclip/Attachment#path-instance_method
これは、たとえばCSVリーダーと一緒に使用できます。
添付ファイルはすでにIOStreamから継承しています。 http://rdoc.info/github/thoughtbot/Paperclip/master/Paperclip/Attachment
したがって、_"#{attachment}"
_または<% RDiscount.new(attachment).to_html %>
またはsend_data(attachment)
である必要があります。ただし、データを表示したかった。
ファイルを表示する前に、ファイルの内容を(Rubys File.openを使用して)変数にロードする必要があります。アプリが頻繁に使用される場合、これはコストのかかる操作になる可能性があるため、ファイルの内容を読み取り、アップロード後にデータベースのテキスト列に配置することをお勧めします。