ペーパークリップでURLから画像を保存


回答:


154

ここに簡単な方法があります:

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"

7
たとえば、次のようにupdate_attributes名前picture_from_urlを変更する必要がある場合picture_url=(value)
Daniel Rikowski 2013年

3
ユーザーがを呼び出すことができるため、これは潜在的に安全ではありませんuser.picture_from_url('/etc/password')。ただし、ほとんどの状況ではおそらく問題ありません。
David Tuite 2013年

1
セキュリティのため、URIのスキームをホワイトリストに登録し、プライベートホストをブラックリストに登録する必要があります
John Douthat

3
より良い解決策については、以下の回答を参照してください。
geekazoid 14

6
を使用するopen(url)と、ファイル名は正確ではありません。たとえばのopen-uri20150106-10034-lpd5fm.代わりにef3a601e_ef3d008b_ef3d0f7e.jpg
Joshua Pinter、2015年

196

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"

3
paperclip wikiから:github.com/thoughtbot/paperclip/wiki/… 私はそれをコンソールで正常に実行し、アプリはherokuにあります。
Donny Kurnia 2013年

3
参考までに、S3のURLについては、まだとして取得application/octet_streamしていcontent_typeます。
Joshua Pinter

5
ペーパークリップ:: UriAdapter.register(configに、または一時的にコンソールを経由してそれはあなたが必要とするすべての場合):あなたはまだそれの廃止後にペーパークリップを使用している場合は、URI IOローダがロードされることを確認する必要があるかもしれません
Msencenb

アプローチは正しいですが、最後のバージョンでは構文が変更されています!以下の私の回答をチェックしてください=> stackoverflow.com/a/56039191/3182171
Diego D


16

解析されたURIに「open」を使用するまで、それは私にとっては機能しませんでした。「open」を追加すると、うまくいきました!

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

ペーパークリップのバージョンは4.2.1です。

ファイルではないため、開く前にコンテンツタイプを正しく検出できませんでした。image_content_type: "binary / octet-stream"と表示され、適切なコンテンツタイプでオーバーライドしても機能しません。


これをありがとう!自分が欠けていたものそのもの。
Dan

これを行うと、延長が失われます。初期化子にPaperclip :: UriAdapter.registerが必要です。最後に.openは必要ありません。github.com/thoughtbot/paperclip/wiki/…を
ianpetzer

15

まず、curbgemを含むイメージをaにダウンロードし、TempFile次にtempfileオブジェクトを割り当ててモデルを保存します。


2
私はこの回答の何が悪いのかわかりません。反対票が出ているので投票します。
jpemberthy

これが最もパフォーマンスの高い答えです(はるかに)。私は実際にはパフォーマンスオタクではありませんが、大きなファイルで作業している場合は、これは実際に加算されます。
2013

3

それはあなたに役立つかもしれません。リモート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

3

それらは古いものなので、ここに新しいものがあります:

画像のリモート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ためですか?
Terence Chow

この関数superは、元のメソッドを呼び出すために使用され、メソッド本体の検索は、元のメソッドを含むことが判明したオブジェクトのスーパークラスから始まります
ミニジョン

2

これは筋金入りの方法です:

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を作成するだけです。


2

公式ドキュメントはこちらで報告されています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動作します。


このおかげで-構成のものは私のためにそれを修正しました(Paperclip v6.1.0)
Owlvark
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.