2010-10-29 3 views

ответ

146

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

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

user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png" 
+0

По какой-то причине мне нужно было использовать update_attribute. –

+0

Простой и эффективный. Спасибо чувак. – goo

+7

Если вам нужно использовать 'update_attributes' переименование' picture_from_url' для 'picture_url = (значение)' например. –

15

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

+2

Я не понимаю, в чем проблема с этим ответом, голосуя за него, потому что я вижу вниз голос. – jpemberthy

+0

Это самый результативный ответ ([на сегодняшний день] (http://toevolve.org/2011/04/03/http-request-performance.html)).Я на самом деле не выродка, но это действительно добавляет, если вы работаете с большими файлами. – Chip

2

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

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 просто делает некоторый случайный идентификатор.

2

Это может быть полезно для вас. Вот код с использованием скрепки и изображения, присутствующих в удаленном 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 
185

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

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

Это немного лучше открытого (url). Потому что с открытым (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" 
+0

Как можно получить эту работу, если вы находитесь за прокси? – Sebastian

+3

Из вики-страницы: https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL Я успешно запускаю ее в консоли, приложение находится в геройку. –

+3

FYI, для URL-адресов S3 Я все еще получаю 'application/octet_stream' как' content_type'. –

3

Как те старый ответ здесь более новый один:

Добавить изображение удаленного 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" %> 
+0

что такое 'супер'? –

+0

Функция 'super' используется для вызова исходного метода, поиск тела метода начинается в суперклассе объекта, который, как было обнаружено, содержит исходный метод –

10

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

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

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

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

Смежные вопросы