Jawaban:
Ini caranya yang sederhana:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
Kemudian cukup:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
. Mungkin baik-baik saja dalam kebanyakan situasi.
open(url)
, nama file tidak akurat, misalnya, open-uri20150106-10034-lpd5fm.
bukan ef3a601e_ef3d008b_ef3d0f7e.jpg
.
Di Paperclip 3.1.4 ini menjadi lebih sederhana.
def picture_from_url(url)
self.picture = URI.parse(url)
end
Ini sedikit lebih baik daripada buka (url). Karena dengan open (url) Anda akan mendapatkan "stringio.txt" sebagai nama filenya. Dengan cara di atas Anda akan mendapatkan nama file yang tepat berdasarkan URL. yaitu
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
sebagai content_type
.
Ini tidak berhasil untuk saya sampai saya menggunakan "buka" untuk URI yang diuraikan. setelah saya menambahkan "buka", itu berhasil!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
Versi penjepit kertas saya adalah 4.2.1
Sebelum dibuka itu tidak akan mendeteksi jenis konten dengan benar, karena itu bukan file. Ini akan mengatakan image_content_type: "binary / octet-stream", dan bahkan jika saya menimpanya dengan tipe konten yang tepat itu tidak akan berhasil.
Pertama unduh gambar dengan curb
permata ke a TempFile
dan kemudian cukup tetapkan objek tempfile dan simpan model Anda.
Mungkin membantu Anda. Berikut adalah kode menggunakan penjepit kertas dan gambar yang ada di URL jarak jauh.
require 'rubygems'
require 'open-uri'
require 'paperclip'
model.update_attribute(:photo,open(website_vehicle.image_url))
Dalam model
class Model < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150x150>", :thumb => "75x75>" }
end
Karena itu adalah Jawaban lama, inilah yang lebih baru:
Tambahkan Image Remote URL ke Controller yang Anda inginkan dalam Database
$ rails generate migration AddImageRemoteUrlToYour_Controller image_remote_url:string
$ rake db:migrate
Edit Model Anda
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
* Di Rails4 Anda harus menambahkan attr_accessible di Controller.
Perbarui formulir Anda, jika Anda mengizinkan orang lain untuk mengunggah Gambar dari URL
<%= f.input :image_remote_url, label: "Enter a URL" %>
super
untuk?
super
ini digunakan untuk memanggil metode asli, pencarian metode tubuh dimulai di kelas super dari objek yang ditemukan mengandung metode asli
Ini adalah metode hardcore:
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)
dimana Uuid.uuid hanya membuat beberapa ID acak.
Ke dalam dokumentasi resmi dilaporkan di sini https://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
Pokoknya sepertinya tidak diperbarui, karena pada versi terakhir penjepit kertas ada yang berubah dan baris kode ini tidak lagi valid:
user.picture = URI.parse(url)
Ini menimbulkan kesalahan, khususnya kesalahan ini dimunculkan:
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
Sintaks baru yang benar adalah yang ini:
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
Juga kita perlu menambahkan baris ini ke file config / initializers / paperclip.rb :
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
Menguji ini dengan versi penjepit kertas 5.3.0
dan berhasil.
update_attributes
ganti namapicture_from_url
menjadipicture_url=(value)
misalnya.