Respostas:
Aqui está uma maneira simples:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
Então simplesmente:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. Provavelmente é bom na maioria das situações.
open(url)
, o nome do arquivo não é exato, por exemplo, em open-uri20150106-10034-lpd5fm.
vez de ef3a601e_ef3d008b_ef3d0f7e.jpg
.
No Paperclip 3.1.4, ficou ainda mais simples.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Isso é um pouco melhor que aberto (url). Porque com open (url) você receberá "stringio.txt" como o nome do arquivo. Com o exposto acima, você receberá um nome adequado do arquivo com base na URL. ie
self.picture = URI.parse("http://something.com/blah/avatar.png")
self.picture_file_name # => "avatar.png"
self.picture_content_type # => "image/png"
application/octet_stream
como content_type
.
Não funcionou para mim até que eu usei "aberto" para URI analisado. uma vez que adicionei "aberto", funcionou!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
Minha versão do clipe de papel é 4.2.1
Antes da abertura, ele não detectava o tipo de conteúdo certo, porque não era um arquivo. Diria image_content_type: "binary / octet-stream" e, mesmo que eu o substitua pelo tipo de conteúdo correto, não funcionará.
Primeiro faça o download da imagem com a curb
gema para a TempFile
e, em seguida, simplesmente atribua o objeto tempfile e salve seu modelo.
Pode ser útil para você. Aqui está o código usando um clipe de papel e uma imagem presente no URL remoto.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
No modelo
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Como esses são antigos respondedores, aqui está um mais novo:
Adicione o URL remoto da imagem ao controlador desejado no banco de dados
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Edite seu modelo
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
* No Rails4, você precisa adicionar o attr_accessible no Controller.
Atualize seu formulário, se você permitir que outro faça upload de uma imagem de um URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
?
super
é usada para invocar o método original, em busca do corpo do método começa na classe super do objeto que foi encontrado para conter o método original
Este é um método incondicional:
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)
onde Uuid.uuid apenas cria algum ID aleatório.
Na documentação oficial é relatada aqui https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
De qualquer forma, não parece atualizado, porque na última versão do clipe de papel algo mudou e esta linha de código não é mais válida:
user.picture = URI.parse(url)
Ele gera um erro, em particular esse erro é gerado:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
A nova sintaxe correta é esta:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Também precisamos adicionar essas linhas no arquivo config / initializers / paperclip.rb :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Testei isso com a versão de clipe de papel 5.3.0
e funciona.
update_attributes
renomearpicture_from_url
para,picture_url=(value)
por exemplo.