回答:
ここに簡単な方法があります:
require "open-uri"
class User < ActiveRecord::Base
has_attached_file :picture
def picture_from_url(url)
self.picture = open(url)
end
end
次に、単に:
user.picture_from_url "http://www.google.com/images/logos/ps_logo2.png"
user.picture_from_url('/etc/password')
。ただし、ほとんどの状況ではおそらく問題ありません。
open(url)
と、ファイル名は正確ではありません。たとえばのopen-uri20150106-10034-lpd5fm.
代わりにef3a601e_ef3d008b_ef3d0f7e.jpg
。
Paperclip 3.1.4では、さらにシンプルになりました。
def picture_from_url(url)
self.picture = URI.parse(url)
end
これはopen(url)よりもわずかに優れています。open(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"
application/octet_stream
していcontent_type
ます。
解析されたURIに「open」を使用するまで、それは私にとっては機能しませんでした。「open」を追加すると、うまくいきました!
def picture_from_url(url)
self.picture = URI.parse(url).open
end
ペーパークリップのバージョンは4.2.1です。
ファイルではないため、開く前にコンテンツタイプを正しく検出できませんでした。image_content_type: "binary / octet-stream"と表示され、適切なコンテンツタイプでオーバーライドしても機能しません。
まず、curb
gemを含むイメージをaにダウンロードし、TempFile
次にtempfileオブジェクトを割り当ててモデルを保存します。
それはあなたに役立つかもしれません。リモート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
それらは古いものなので、ここに新しいものがあります:
画像のリモート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" %>
super
ためですか?
super
は、元のメソッドを呼び出すために使用され、メソッド本体の検索は、元のメソッドを含むことが判明したオブジェクトのスーパークラスから始まります
これは筋金入りの方法です:
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はランダムなIDを作成するだけです。
公式ドキュメントはこちらで報告されていますhttps://github.com/thoughtbot/paperclip/wiki/Attachment-downloaded-from-a-URL
とにかくそれは更新されていないようです、なぜならペーパークリップの最後のバージョンでは何かが変更されており、このコード行はもはや有効ではありません:
user.picture = URI.parse(url)
エラーが発生します。特に、次のエラーが発生します。
Paperclip::AdapterRegistry::NoHandlerError: No handler found for #<URI:: ...
新しい正しい構文は次のとおりです。
url = "https://www.example.com/photo.jpeg"
user.picture = Paperclip.io_adapters.for(URI.parse(url).to_s, { hash_digest: Digest::MD5 })
また、これらの行をconfig / initializers / paperclip.rbファイルに追加する必要があります。
Paperclip::DataUriAdapter.register
Paperclip::HttpUrlProxyAdapter.register
ペーパークリップバージョンでこれをテストし、5.3.0
動作します。
update_attributes
名前picture_from_url
を変更する必要がある場合picture_url=(value)
。