2012-06-13 90 views
12

我使用ruby 1.9.2以及Rails 3.1.4和Paperclip 2.4.5。Ruby open-uri open方法丟失文件擴展名open images

我的問題是試圖挽救一個回形針附件從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

我不確定這是否有助於您的情況,但我注意到類似的問題在我的項目。

這個問題竟然不是由Paperclip也不是由open-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