클립으로 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_urlpicture_url=(value)예를 들어.
Daniel Rikowski 2013-06-02

3
사용자가를 호출 할 수 있기 때문에 이것은 잠재적으로 안전하지 않습니다 user.picture_from_url('/etc/password'). 하지만 대부분의 상황에서는 괜찮습니다.
David Tuite 2013-10-11

1
보안을 위해 URI 스키마를 화이트리스트에 추가하고 개인 호스트를 블랙리스트에 추가해야합니다.
John Douthat 2014 년

3
더 나은 솔루션은 아래 답변을 참조하십시오.
geekazoid

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는 AS content_type.
Joshua Pinter 2015 년

5
사용이 중단 된 후에도 Paperclip을 계속 사용하는 경우 URI IO 로더가로드되었는지 확인해야 할 수 있습니다. Paperclip :: UriAdapter.register (구성에서 또는 필요한 경우 콘솔을 통해 일시적으로)
Msencenb

접근 방식은 정확하지만 마지막 버전에서는 신택스가 변경되었습니다! 아래 내 대답을 확인하십시오 => stackoverflow.com/a/56039191/3182171
Diego D

당신은 초기화에 항목을 추가 할 필요가 github.com/thoughtbot/paperclip/wiki/...
ianpetzer

16

구문 분석 된 URI에 대해 "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

이것은 가장 성능이 좋은 대답입니다 ( 지금까지 ). 나는 실제로 성능 광은 아니지만 큰 파일로 작업하는 경우 실제로 추가됩니다.

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.