web-dev-qa-db-ja.com

paperclipでURLから画像を保存

PaperclipでURLから画像を保存する方法を提案してください。

118
khanh

簡単な方法を次に示します。

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"
154
Nicolas Blanco

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"
193
Aditya Sanghi

解析されたURIに「open」を使用するまで、それは機能しませんでした。 「open」を追加すると、機能しました。

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

Paperclipバージョンは4.2.1です

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

16

最初にcurb gemを含むイメージをTempFileにダウンロードしてから、tempfileオブジェクトを割り当ててモデルを保存します。

15
Ariejan

役に立つかもしれません。これは、リモートURLに存在するPaperclipと画像を使用したコードです。

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
prabu

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

画像リモート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" %>
3
Mini John

公式ドキュメントへの報告はこちら https://github.com/thoughtbot/Paperclip/wiki/Attachment-downloaded-from-a-URL

とにかく、Paperclipの最後のバージョンで何かが変更され、このコード行はもはや有効ではないため、更新されていないようです。

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

これをPaperclipバージョン5.3.0でテストし、動作します。

2
Diego D

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

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