Открытый метод открытия Ruby open-uri теряет открывающиеся файлы
Я использую ruby 1.9.2 вместе с Rails 3.1.4 и Paperclip 2.4.5.
Моя проблема заключается в попытке сохранить вложение paperclip из 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>
Поскольку в файле temp нет расширения, программа paperclip сохраняет файл без каких-либо проблем.
Кто-нибудь сталкивался с этой проблемой? Я видел несколько ответов об использовании paperclip для хранения изображений из URI, но ни один из них не касается той же проблемы, с которой мы работаем
Ответы
Ответ 1
Не используйте временный файл! Он там как заполнитель, так как файл считывается из порта и должен считаться частным ресурсом для 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
блокируется, поэтому ваш код останавливается там до тех пор, пока файл не будет возвращен вам. Затем вы можете играть с ним.
Ответ 2
Расширение не важно для временного файла, но если вы хотите использовать этот файл в коде или сохранить в другом месте. Вы можете сделать это:
temp_file = open(params[:url])
def temp_file.original_filename; File.basename(base_uri.path); end
Теперь вы можете сохранить этот временный файл на постоянное место или использовать его в коде; Исходное имя файла будет использоваться автоматически.
Ответ 3
Я не уверен, что это поможет в вашем случае, но я заметил подобные проблемы в своем проекте.
Проблема оказалась не вызванной Paperclip
и open-uri
, а получателем файла скрепки (в моем случае Spree Commerce
). Убедитесь, что вы назначаете объект paperclip правильному объекту и что он интерпретируется правильно.
Исправление, которое сработало для меня, должно было измениться:
@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)
Удачи вам в вашей проблеме
Ответ 4
Вы добавили расширение: в свой путь/URL-адрес?
Например:
has_attached_file :image,
...
:url => '/images/highlights/:id_partition/:style_:id.:extension',
:path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension'
Это, вероятно, решит вашу проблему.
Вы можете принудительно расширить расширение, но я не думаю, что это рекомендуется.
Ответ 5
Обновление - Скрепка может сделать это сама по себе!
Написал Aditya Sanghi (спасибо большое!):
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/
Ответ 6
Да, это проблема, но мы можем обойти это с помощью fancybox.
В теге link (для изображения) добавьте :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=#!topic/fancybox/QgjquBCLynU