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

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

6 ответов


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

class Document

  has_attached_file :revision

  def revision_contents
    revision.copy_to_local_file.read
  end

end

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


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

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

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

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


@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 метод выполняет то же самое и кажется лучшим, более чистым способом сделать это IMHO.


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


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

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