2012-06-13 10 views
12

Używam Ruby 1.9.2 wraz z Rails 3.1.4 i Paperclip 2.4.5.Metoda otwartej ruby ​​open-uri traci obrazy otwierające rozszerzenie pliku

Mój problem polega na próbie zapisania załącznika do spinacza z URI, który traci rozszerzenie pliku i zapisuje plik bez powodując problemy z takimi elementami jak fancybox, które wymagają rozszerzenia.

Niektóre przykładowy kod:

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

Ponieważ nie ma rozszerzenie pliku na spinacz temp zapisuje plik bez jednego w wyniku problemów.

Czy ktoś napotkał ten problem? Widziałem wiele odpowiedzi na temat używania spinacza do przechowywania obrazów z identyfikatora URI, ale nie wydaje się, aby adresować ten sam problem, który używamy,

+1

jestem obliczu tego problemu, jak również. – jfedick

Odpowiedz

0

Nie jestem pewien, czy to pomoże w twoim przypadku, ale zauważyłem podobne problemy w moim projekt.

Problem okazał się nie być spowodowany przez Paperclip ani open-uri, ale odbiorcą pliku spinacza (w moim przypadku Spree Commerce). Sprawdź, czy przypisujesz obiekt spinacza do właściwego obiektu i czy jest on poprawnie interpretowany.

Rozwiązaniem że pracował dla mnie było zmienić:

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

do

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

Powodzenia w kwestii

-1

Tak, to jest problem, ale można to obejść z fancyboxem.

w znaczniku łącza (na obrazie) dodać :type => 'image'

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

Poprzez określenie 'typ', Fancybox nadpisuje typem obrazu

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

+1

to naprawdę nie za wiele i dodaje wymóg, aby fancybox wyświetlał obrazy – Jimmy

0

Czy inclued się: rozbudowa w twojej opcja ścieżki/adresu URL?

Na przykład:

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

To będzie prawdopodobnie rozwiązać problem. Możesz wymusić tam rozszerzenie, ale nie sądzę, że jest to zalecane.

3

Nie używaj pliku tymczasowego! Jest tam jako element zastępczy, ponieważ plik jest czytany z portu i należy go traktować jako prywatny zasób dla OpenURI. Zamiast tego należy użyć open(url).read i pracować z wynikową treścią, zapisując ją.

zrobić coś takiego:

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 

Tymczasowo zawijające do dysku podczas operacji, zwłaszcza działanie sieci, jest powszechne. Po zgromadzeniu zawartości pliku można ją przekazać do aplikacji.read jest blokowany, więc Twój kod zostanie zatrzymany, dopóki plik nie zostanie zwrócony. Wtedy możesz z nim grać.

2

Rozszerzenie nie jest ważne dla pliku tymczasowego, ale jeśli chcesz użyć tego pliku w kodzie lub zapisać w innym miejscu. Możesz to zrobić:

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

Teraz możesz zapisać ten tymczasowy plik na stałe miejsce lub użyć go w kodzie; Oryginalna nazwa pliku będzie używana automatycznie.

+0

Nie działa. Pewna dodatkowa magia wydaje się niezbędna, aby uczynić element "base_uri" dostępnym dla zdefiniowanej metody original_filename tutaj, fyi. – ericpeters0n