Как получить доступ к необработанному содержимому файла, загруженного с помощью Paperclip / Ruby on Rails? - PullRequest
24 голосов
/ 02 июля 2011

Я использую Paperclip / S3 для загрузки файлов.Я загружаю текстовые файлы (не .txt, но они по сути являются .txt).В контроллере шоу я хочу иметь возможность получать содержимое загруженного файла, но не рассматриваю содержимое как один из его атрибутов.Что я могу сделать здесь?

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 - Похоже, что все уроки Paperclip касаются изображений, а не текстовых файлов.

Ответы [ 6 ]

85 голосов
/ 22 апреля 2014

В Paperclip 3.0.1 вы можете просто использовать io_adapter, который не требует записи (и удаления из) локальной файловой системы.

Paperclip.io_adapters.for(attachment.file).read
5 голосов
/ 13 декабря 2013

Для доступа к файлу вы можете использовать метод пути: csv_file.path http://rdoc.info/gems/paperclip/Paperclip/Attachment#path-instance_method

Это может быть использовано вместе, например, с читателем CSV.

4 голосов
/ 28 ноября 2016

@ 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

Немного запутанно, как @jwadsack упоминается сPaperclip.io_adapters.for метод выполняет то же самое и кажется лучшим, более чистым способом сделать это ИМХО.

4 голосов
/ 02 июля 2011

Вот как я могу получить доступ к исходному содержимому моего вложения:

class Document

  has_attached_file :revision

  def revision_contents
    revision.copy_to_local_file.read
  end

end

Обратите внимание, я опустил параметры конфигурации скрепки и все виды обработки ошибок.

1 голос
/ 02 июля 2011

Вложение уже наследуется от IOStream. http://rdoc.info/github/thoughtbot/paperclip/master/Paperclip/Attachment

Так что это должно быть просто "#{attachment}" или <% RDiscount.new(attachment).to_html %> или send_data(attachment). Однако вы хотели отобразить данные.

1 голос
/ 02 июля 2011

Вам необходимо загрузить содержимое файла (используя Rubys File.open) в переменную, прежде чем вы его покажете. Это может быть дорогостоящей операцией, если ваше приложение часто используется, поэтому может быть целесообразно прочитать содержимое файла и поместить его в текстовый столбец в вашей базе данных после его загрузки.

...