Подтвердить что ты не робот

Открытый метод открытия 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, но ни один из них не касается той же проблемы, с которой мы работаем

4b9b3361

Ответ 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