2012-06-13 10 views
12

Sto usando Ruby 1.9.2 insieme a Rails 3.1.4 e Paperclip 2.4.5.Il metodo aperto open-uri rubino perde le immagini di apertura dell'estensione del file

Il mio problema è cercare di salvare un allegato di graffetta da un URI che perde l'estensione del file e salva il file senza che si verifichino problemi con cose come fancybox che richiedono un'estensione.

qualche esempio di codice:

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

Poiché non v'è alcuna estensione sul file temporaneo graffetta è salvare il file senza un conseguente problemi.

Qualcuno si è imbattuto in questo problema? Ho visto più risposte sull'utilizzo di paperclip per archiviare immagini da un URI ma nessuno sembra affrontare lo stesso problema che stiamo utilizzando

+1

Sto affrontando questo problema pure. – jfedick

risposta

0

Non sono sicuro che questo aiuterà nel tuo caso, ma ho notato problemi simili nel mio progetto.

Il problema non è stato causato da Paperclip né da open-uri, ma dal destinatario del file di graffette (nel mio caso Spree Commerce). Verifica di assegnare l'oggetto paperclip all'oggetto giusto e che sia interpretato correttamente.

La correzione che ha funzionato per me è stato quello di cambiare:

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

a

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

Buona fortuna con il tuo problema

-1

Sì, è un problema, ma siamo in grado di ovviare a questo con fancybox.

Nel tag link (per un'immagine) aggiungere :type => 'image'

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

Specificando 'tipo', Fancybox sovrascrive il tipo di immagine

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

+1

questo non si aggira molto e aggiunge un requisito per fancybox per visualizzare le immagini – Jimmy

0

Avete inclued il: interno nel proprio opzione percorso/url?

Ad esempio:

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

Questo sarà probabilmente risolvere il problema. È possibile forzare un'estensione lì, ma non penso che sia raccomandato.

3

Non utilizzare il file temporaneo! È presente come segnaposto quando il file viene letto dalla porta e deve essere considerato una risorsa privata per OpenURI. Invece, utilizzare open(url).read e lavorare con il contenuto risultante salvandolo.

fare qualcosa di simile:

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 

temporaneamente lo spooling sul disco durante un'operazione, in particolare l'operazione di rete, è comune. Una volta che il contenuto del file è stato accumulato, è disponibile per essere trasmesso all'app.read sta bloccando, quindi il tuo codice si fermerà qui finché il file non ti verrà restituito. Quindi puoi giocarci.

2

L'estensione non è importante per il file temporaneo, ma se si desidera utilizzare questo file nel codice o salvare in un altro posto. Puoi farlo:

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

Ora, puoi salvare questo file temporaneo in spazio permanente o usarlo nel codice; Il nome file originale verrà utilizzato automaticamente.

+0

Non funziona. Alcune magie aggiuntive sembrano essere necessarie per rendere 'base_uri' accessibile al metodo original_filename definito qui, fyi. – ericpeters0n

Problemi correlati