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