Сохранить изображение из URL с помощью скрепки - PullRequest
118 голосов
/ 29 октября 2010

Пожалуйста, предложите мне способ сохранить изображение с URL-адреса с помощью Paperclip.

Ответы [ 8 ]

193 голосов
/ 20 июля 2012

В Paperclip 3.1.4 это стало еще проще.

def picture_from_url(url)
  self.picture = URI.parse(url)
end

Это немного лучше, чем открытый (URL). Потому что с open (url) вы получите «stringio.txt» в качестве имени файла. С учетом вышеизложенного вы получите правильное имя файла на основе URL. т.е.

self.picture = URI.parse("http://something.com/blah/avatar.png")

self.picture_file_name    # => "avatar.png"
self.picture_content_type # => "image/png"
152 голосов
/ 29 октября 2010

Вот простой способ:

require "open-uri"

class User < ActiveRecord::Base
  has_attached_file :picture

  def picture_from_url(url)
    self.picture = open(url)
  end
end

Тогда просто:

user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
15 голосов
/ 21 мая 2015

Это не сработало для меня, пока я не использовал «open» для разобранного URI. как только я добавил «открыть», это сработало!

def picture_from_url(url)
  self.picture = URI.parse(url).open
end

Моя версия скрепки 4.2.1

Перед открытием не будет правильно определен тип контента, потому что это не файл. Было бы сказано image_content_type: «двоичный / октет-поток», и даже если я переопределить его с правильным типом контента, он не будет работать.

15 голосов
/ 29 октября 2010

Сначала загрузите изображение с гемом curb в TempFile, а затем просто назначьте объект временного файла и сохраните модель.

3 голосов
/ 26 августа 2013

Поскольку это старые Ответы, вот новый:

Добавление удаленного URL-адреса изображения к нужному контроллеру в базе данных

$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate

Редактировать модель

attr_accessible :description, :image, :image_remote_url
.
.
.
def image_remote_url=(url_value)
  self.image = URI.parse(url_value) unless url_value.blank?
  super
end

* В Rails4 вы должны добавить attr_accessible в контроллере.

Обновите форму, если вы разрешаете другим загружать изображения с URL-адреса

<%= f.input :image_remote_url, label: "Enter a URL" %>
3 голосов
/ 21 мая 2011

Это может быть полезно для вас.Вот код с использованием скрепки и изображения, присутствующего в удаленном URL.

require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))

В модели

class Model < ActiveRecord::Base
  has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
2 голосов
/ 07 апреля 2011

Это хардкорный метод:

original_url = url.gsub(/\?.*$/, '')
filename = original_url.gsub(/^.*\//, '')
extension = File.extname(filename)

temp_images = Magick::Image.from_blob open(url).read
temp_images[0].write(url = "/tmp/#{Uuid.uuid}#{extension}")

self.file = File.open(url)

, где Uuid.uuid просто делает некоторый случайный идентификатор.

0 голосов
/ 08 мая 2019

В официальную документацию сообщается здесь https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL

В любом случае, кажется, что он не обновлен, потому что в последней версии скрепки что-то изменилось, и эта строка кода больше не действительна:

user.picture = URI.parse(url)

Это вызывает ошибку, в частности, эта ошибка возникает:

Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...

Новый правильный синтаксис следующий:

url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })

Также нам нужно добавить эти строки в config / initializers / paperclip.rb file:

Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register

Протестировано с версией скрепки 5.3.0, и она работает.

...