Ruby open-uri метод open теряет расширение файла при открытии изображения

Я использую ruby ​​1.9.2 вместе с Rails 3.1.4 и Paperclip 2.4.5.

Моя проблема при попытке сохранить вложение скрепки из URI теряет расширение файла и сохраняет файл без такового, что приводит к проблемам с такими вещами, как fancybox, которые требуют расширения.

Пример кода:

uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png"
open(uri)
#=> #<File:/var/folders/zc/d69gxhzx10x_bvjrkqgyjgxr0000gn/T/open-uri20120613-27204-i6cldv>

Поскольку временный файл не имеет расширения, paperclip сохраняет файл без проблем.

Кто-нибудь сталкивался с этой проблемой? Я видел несколько ответов об использовании скрепки для хранения изображений из URI, но ни один из них не решает ту же проблему, что и мы

6 ответов

Не используйте временный файл! Он там как заполнитель, так как файл читается из порта и должен рассматриваться как частный ресурс для OpenURI, Вместо этого используйте open(url).read и работать с полученным содержимым, сохраняя его.

Сделать что-то вроде:

require 'uri'
require 'open-uri'

url = 'http://www.iana.org/domains/example/index.html'
filename = File.basename(URI.parse(url).path)
File.open(filename, 'wb') do |fo|
  fo.write(open(url).read)
end

Временная подмена на диск во время операции, особенно сетевой операции, является обычной практикой. После того, как содержимое файла будет накоплено, его можно будет передать приложению. read блокируется, поэтому ваш код будет останавливаться до тех пор, пока файл не будет возвращен вам. Тогда вы можете играть с ним.

Расширение не важно для временного файла, но если вы хотите использовать этот файл в коде или сохранить в другом месте. Ты можешь это сделать:

temp_file = open(params[:url])
def temp_file.original_filename; File.basename(base_uri.path); end

Теперь вы можете сохранить этот временный файл на постоянное место или использовать его в коде; Оригинальное имя файла будет использовано автоматически.

Обновление - Скрепка может сделать это самостоятельно!

Автор Адитья Санги (спасибо большое!):

current_comments.pictures.create!(file: URI.parse(image_url))

Хотя имейте в виду, что вам все еще нужно обрабатывать ошибки 500, 404 и т. Д. (Paperclip может их вызвать).

Спасибо: https://mensfeld.pl/2013/12/rails-paperclip-open-uri-downloading-files-from-the-internet-and-saving-them-with-paperclip/

Включили ли вы: расширение в свой путь / URL-адрес?

Например:

has_attached_file :image,
  ...
  :url  => '/images/highlights/:id_partition/:style_:id.:extension',
  :path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension'

Это, вероятно, решит вашу проблему. Вы можете принудительно установить расширение, но я не думаю, что это рекомендуется.

Я не уверен, поможет ли это в вашем случае, но я заметил подобные проблемы в моем проекте.

Проблема оказалась не вызвана Paperclip ни open-uri, но получатель файла скрепки (в моем случае Spree Commerce). Убедитесь, что вы назначаете объект скрепки для правильного объекта, и что он интерпретируется правильно.

Исправление, которое работало для меня, было изменить:

@product.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true)

в

@product.master.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true)

Удачи в вашей проблеме

Да, это проблема, но мы можем обойти это с помощью fancybox.

В теге ссылки (для изображения) добавьте :type => 'image'

- @images.each do |image|
 = link_to image_tag(image.attachment.url),   image.attachment.url, class: "fancybox", type: 'image'

Указав тип, Fancybox переопределяет тип как изображение

https://groups.google.com/forum/?fromgroups=

Другие вопросы по тегам