2011-12-05 16 views
6

Il codice che sto usando:Impossibile leggere il file con la funzione send_file in Rails 3

In considerazione del file:

<%= link_to "Download", download_image_path(image) %> 

In regolatore:

def download 
    @image = Image.find(params[:id]) 
    send_file "#{RAILS_ROOT}/public" + @image.attachment.url 
end 

sto ottenendo un errore:

Cannot read file /Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022 

PS: doppio controllo, il file esiste. Stesso problema sul server, per tutti i file (immagini, pdf, video) in tutti i rispettivi controller.

risposta

15

problema era:

stavo usando

@image = Image.find(params[:id]) 
send_file "#{RAILS_ROOT}/public" + @image.attachment.url 

Dovrebbe essere

@image = Image.find(params[:id]) 
send_file @image.attachment.path 

PS: Assicurati di convalidare esista quell'immagine/record.

+0

se analizzi il codice usando brakeman, allora mostrerà l'errore come attributo MOdel usato come nome file. basta correre il frenatore. è considerato come send_file Image.find (parametri [: id]). Loaded_file.path – errakeshpd

0

Questo ?1320582022 appartiene al nome file? Non sono nemmeno sicuro degli spazi bianchi nel nome del file, forse hanno bisogno di essere sfuggiti.

+0

Screen Shot 2011-11-04 al 3.14.03 PM.png è il nome del file e 1.320.582,022 mila è in arrivo causa im ottenere problema in modalità di sviluppo .. –

1

io non so come si salva l'immagine allegato URL, ma in generale, un nome di file dovrebbe avere:

/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png 

Avviso non ha alla fine "xxxxx?".

È possibile controllare il file system, indipendentemente dal fatto che il nome del file sia "Schermata 2011-11-04 alle ore 3.14.03 PM.png" o "Schermata 2011-11-04 alle 3.14.03 PM.png" 1320582022 ".

Per l'URL del file, è possibile che si tratti di: http://example.com/xxx?dddd, quale carattere "?" dividere il percorso e i parametri. La stringa "dddd" è un parametro quando viene richiesto il percorso url, non è una parte del percorso o del nome file. I parametri supportano solo in url, non il nome del file locale.

Quindi, penso che sia necessario verificare il codice di salvataggio dell'URL di collegamento immagine, che deve escludere i parametri e solo il nome file. E assicurati che il nome sia esattamente uguale al file salvato su disco.

E si può provare ad aprire il file anche se irb direttamente e controllare l'output:

>>> irb 
irb> f = open('/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022') 

Altri, cercare di trovare la posizione di errore nella send_file, e controllare il nome del file.

Non riesco ancora a verificare quale sia veramente il problema, solo qualche suggerimento.

+0

Questo era un buon suggerimento .. –

2

basta cambiare metodo URL percorso:?

send_file @image.attachment.path # this is the right way!.