2012-06-13 5 views
12

저는 Rails 3.1.4와 Paperclip 2.4.5와 함께 ruby ​​1.9.2를 사용하고 있습니다.Ruby open-uri open 메서드가 파일 확장 열기 이미지를 잃습니다.

URI에서 클립 클립 첨부 파일을 저장하려고하면 파일 확장명이 손실되고 파일을 저장하지 않고 파일을 저장하면 확장 기능이 필요한 fancybox와 같은 문제가 발생합니다.

일부 예제 코드 :

uri = "http://featherfiles.aviary.com/2012-06-13/bbe5f0de1/0c5a672b88ea47ecb4631ac173e27430.png" 
open(uri) 
#=> #<File:/var/folders/zc/d69gxhzx10x_bvjrkqgyjgxr0000gn/T/open-uri20120613-27204-i6cldv> 

문제의 결과로 하나없이 파일을 저장하는 임시 파일 클립에 확장자가 없기 때문입니다.

누구에게이 문제가 발생 했습니까? URI에서 이미지를 저장하기 위해 클립 클립을 사용하는 것에 대한 여러 답을 보았습니다. 그러나 아무 것도 우리가 실행하는 동일한 문제를 해결하지 못하는 것 같습니다

+1

나뿐만 아니라이 문제에 직면하고있다. – jfedick

답변

0

당신의 경우에 도움이 될지 확실하지 않지만, 계획.

문제

Paperclipopen-uri 발생하지 밝혀졌다, 그러나 (내 경우 Spree Commerce 단위) 클립 파일의 수신기. 클립 클립 개체를 올바른 개체에 할당하고 올바르게 해석되고 있는지 확인하십시오.

나를 위해 일한 수정 변경했다

:

@product.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true) 

@product.master.images << Spree::Image.create({ 
    :attachment => open(image_url) 
}, :without_protection => true) 

행운에 문제를

-1

예, 그것은 문제가 있지만, 우리는이 문제를 얻을 수 있습니다 fancybox. 링크 태그에서

(이미지) '타입'을 지정하여 :type => 'image'

- @images.each do |image| 
= link_to image_tag(image.attachment.url), image.attachment.url, class: "fancybox", type: 'image' 

을 추가, Fancybox는

https://groups.google.com/forum/?fromgroups=#!topic/fancybox/QgjquBCLynU

+1

이것은 실제로 많이 돌아 가지 않으며 이미지를 표시하기 위해 fancybox에 대한 요구 사항을 추가합니다. – Jimmy

0

당신이 inclued 적이 이미지로 유형 우선 :에서 확장하여 경로/URL 옵션? 예를 들어

:

has_attached_file :image, 
    ... 
    :url => '/images/highlights/:id_partition/:style_:id.:extension', 
    :path => ':rails_root/files/images/highlights/:id_partition/:style_:id.:extension' 

이것은 아마 당신의 문제를 해결합니다. 당신은 거기에 확장을 강제 수 있지만, 나는 그것이 권장하지 않습니다.

3

임시 파일을 사용하지 마십시오. 이 파일은 포트에서 파일을 읽을 때 자리 표시 자로 사용되며 OpenURI의 개인 자원으로 간주되어야합니다. 대신 open(url).read을 사용하고 결과 콘텐츠를 저장하여 작업하십시오. 같은 수행

:

require 'uri' 
require 'open-uri' 

url = 'http://www.iana.org/domains/example/index.html' 
filename = File.basename(URI.parse(url).path) 
File.open(filename, 'wb') do |fo| 
    fo.write(open(url).read) 
end 

이 일시적으로 작업하는 동안 디스크에 스풀링, 특히 네트워크 작업은 일반적입니다. 파일의 콘텐츠가 누적되면 앱으로 전달할 수 있습니다.read이 (가) 차단되므로 파일이 반환 될 때까지 코드가 중지됩니다. 그러면 그걸 가지고 놀 수 있습니다.

2

임시 파일의 확장자는 중요하지 않지만이 파일을 코드에 사용하거나 다른 위치에 저장하려는 경우에 중요합니다. 할 수 있습니다 :

temp_file = open(params[:url]) 
def temp_file.original_filename; File.basename(base_uri.path); end 

이제이 임시 파일을 영구 공간에 저장하거나 코드에서 사용할 수 있습니다. 원본 파일 이름이 자동으로 사용됩니다.

+0

작동하지 않습니다. 여기에 정의 된 original_filename 메소드 인 'base_uri'를 액세스 가능하게 만드는 데 필요한 추가 마법이 있습니다. – ericpeters0n

0

업데이트 - Paperclip에서이 작업을 직접 수행 할 수 있습니다.

은 아 딧야 Sanghi으로 (덕분에 많이!) 게시 됨 : 명심

current_comments.pictures.create!(file: URI.parse(image_url)) 

있지만, 당신은 여전히 ​​(종이 클립이 그들을 올릴 수 있습니다) (500), (404) 등 오류를 처리 할 필요가있다.

덕분에 : https://mensfeld.pl/2013/12/rails-paperclip-open-uri-downloading-files-from-the-internet-and-saving-them-with-paperclip/

관련 문제