簡體   English   中英

Ruby open-uri open方法丟失文件擴展名打開圖像

[英]Ruby open-uri open method loses file extension opening images

我正在使用ruby 1.9.2以及Rails 3.1.4和Paperclip 2.4.5。

我的問題是嘗試從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>

因為臨時文件沒有擴展名,回形針正在保存文件而不會導致文件出現問題。

有沒有人遇到過這個問題? 我已經看到了關於使用paperclip存儲來自URI的圖像的多個答案,但似乎沒有解決我們正在運行的相同問題

不要使用臨時文件! 它作為占位符存在,因為文件是從端口讀取的,應該被視為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是阻塞的,因此您的代碼將停在那里,直到文件返回給您。 然后你可以玩它。

擴展對於臨時文件並不重要,但如果要在代碼中使用此文件或保存到其他位置。 你能行的:

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

現在,您可以將此臨時文件保存到永久空間或在代碼中使用它; 原始文件名將自動使用。

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

事實證明,問題不是由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)

祝你好運

你在路徑/網址選項中包含了:擴展名嗎?

例如:

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

這可能會解決您的問題。 你可以在那里強制擴展,但我不認為這是推薦的。

更新 - Paperclip可以自行完成!

Aditya Sanghi發表(非常感謝!):

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

雖然記住,你仍然需要處理500,404等錯誤(Paperclip可以提高它們)。

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

是的,這是一個問題,但我們可以用fancybox解決這個問題。

在鏈接標記(對於圖像)中添加:type => 'image'

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

通過指定'type',Fancybox會將類型覆蓋為圖像

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM