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.