URL'deki resmi ataşla kaydedin


Yanıtlar:


154

İşte basit bir yol:

require "open-uri"

class User < ActiveRecord::Base
  has_attached_file :picture

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

O zaman basitçe:

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

7
Kullanmak gerekiyorsa update_attributesyeniden adlandırma picture_from_urliçin picture_url=(value)örneğin.
Daniel Rikowski

3
Bu potansiyel olarak güvensizdir çünkü bir kullanıcı arayabilir user.picture_from_url('/etc/password'). Yine de çoğu durumda muhtemelen iyidir.
David Tuite

1
Güvenlik için, URI'nin şemasını beyaz listeye almalı ve özel ana bilgisayarları kara listeye almalısınız
John Douthat

3
Daha da iyi bir çözüm için aşağıdaki yanıta bakın.
geekazoid

6
Kullanılması open(url), dosya adı doğru değildir, örneğin open-uri20150106-10034-lpd5fm.yerine ef3a601e_ef3d008b_ef3d0f7e.jpg.
Joshua Pinter

196

Paperclip 3.1.4'te daha da basit hale geldi.

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

Bu open (url) 'den biraz daha iyidir. Çünkü open (url) ile dosya adı olarak "stringio.txt" alacaksınız. Yukarıdakilerle, URL'ye bağlı olarak dosyanın uygun bir adını alacaksınız. yani

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

self.picture_file_name    # => "avatar.png"
self.picture_content_type # => "image/png"

3
Ataç wiki'den : github.com/thoughtbot/paperclip/wiki/… Başarıyla konsolda çalıştırıyorum, uygulama heroku'da.
Donny Kurnia

3
Bilginize, S3 URL'ler için hala olsun application/octet_streamolarak content_type.
Joshua Pinter

5
Kullanımdan kaldırıldıktan sonra hala ataç kullanıyorsanız, URI IO yükleyicinin yüklendiğinden de emin olmanız gerekebilir: Paperclip :: UriAdapter.register (yapılandırmada veya ihtiyacınız olan tek şey buysa konsol aracılığıyla geçici olarak)
Msencenb

Yaklaşım doğrudur ancak son versiyonda sintax değişmiştir! Aşağıdaki
Diego D

Başlatıcıya giriş eklemeniz gerekiyor github.com/thoughtbot/paperclip/wiki/…
ianpetzer

16

Ayrıştırılmış URI için "açık" kullanana kadar işime yaramadı. "aç" ı ekledikten sonra işe yaradı!

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

Ataç sürümüm 4.2.1

Açmadan önce, bir dosya olmadığı için içerik türünü doğru algılamıyordu. İmage_content_type: "binary / octet-stream" derdi ve onu doğru içerik türüyle geçersiz kılsam bile işe yaramaz.


Bunun için teşekkürler! Tam olarak kendimi özlediğim şey.
Dan

Bunu yaparsan, uzamanı kaybedeceksin. Başlatıcıda Paperclip :: UriAdapter.register'a ihtiyacınız var .. o zaman sonunda .open'a ihtiyacınız yok. Bkz. Github.com/thoughtbot/paperclip/wiki/…
ianpetzer

15

Önce curbgem ile görüntüyü TempFilea'ya indirin ve ardından geçici dosya nesnesini atayın ve modelinizi kaydedin.


2
Bu cevapta neyin yanlış olduğunu görmüyorum, çünkü oy veriyorum çünkü olumsuz bir oy görüyorum.
jpemberthy

Bu (etkili ve verimli cevap arayla ). Ben gerçekten bir performans meraklısı değilim, ancak büyük dosyalarla çalışıyorsanız bu gerçekten artıyor.
Çip

3

Size yardımcı olabilir. Uzak URL'de bulunan ataş ve görüntü kullanan kod.

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

Modelde

class Model < ActiveRecord::Base
  has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end

3

Bunlar eski olduğu için, Cevaplayanlar işte daha yenisi:

Veritabanında istediğiniz Denetleyiciye Image Remote URL ekleyin

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

Modelinizi düzenleyin

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'te, Denetleyiciye attr_accessible eklemeniz gerekir.

Başkalarının bir URL'den Resim yüklemesine izin verirseniz, formunuzu güncelleyin

<%= f.input :image_remote_url, label: "Enter a URL" %>

ne superiçin
Terence Chow

İşlev super, orijinal yöntemi çağırmak için kullanılır, yöntem gövdesinin aranması, orijinal yöntemi içerdiği bulunan nesnenin süper sınıfında başlar
Mini John

2

Bu sert bir yöntemdir:

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)

burada Uuid.uuid rastgele bir kimlik oluşturur.


2

Resmi belgelere burada https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL bildirilir

Her neyse, güncellenmemiş gibi görünüyor, çünkü ataşın son sürümünde bir şeyler değişti ve bu kod satırı artık geçerli değil:

user.picture = URI.parse(url)

Bir hata ortaya çıkarır, özellikle şu hata ortaya çıkar:

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

Yeni doğru sözdizimi şudur:

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

Ayrıca bu satırları config / initializers / paperclip.rb dosyasına eklememiz gerekiyor :

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

Bunu ataç versiyonu ile test etti 5.3.0ve işe yarıyor.


Bunun için teşekkürler - yapılandırma öğeleri benim için sorunu çözdü (Paperclip v6.1.0)
Owlvark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.