2010-04-13 13 views
10

ho iniziato ad usare il modulo nginx upload (che crea file di upload come/tmp/000.121.545), ma ho bisogno di graffetta di utilizzare il nome del file originale durante il salvataggio dei file (come /public/avatars/LuckyLuke.jpg)da dove proviene la graffetta per ottenere il nome del file originale?

precedenza nei parametri Rails stavano passando solo

"avatar"=>#<File:/tmp/RackMultipart20100413-6151-t3ecq0-0> 

senza nome file originale, quindi mi chiedo da dove viene in graffetta? ho provato a guardare attraverso il codice del plugin ma al momento è un po 'troppo complesso per me.

risposta

19

Il browser invia un'intestazione http con il nome del file. ("Content-Disposition: filename = original_file.jpg")

Rails lo rende disponibile come metodo di istanza dell'oggetto file temp: params[:avatar].original_filename e paperclip lo utilizza.

In dettaglio, Rack analizza il modulo multipart in Rack :: Utils :: Multipart :: UploadedFile e inserisce un hash nei parametri che include :tempfile e :filename. Quindi ActionDispatch :: Http :: Upload arriva e sostituisce tale hash dall'oggetto File (valore di: tempfile), estendendolo con il modulo ActionDispatch :: Http :: UploadedFile, che aggiunge una variabile di istanza per original_path e il metodo original_filename.

+0

Yap, è Content-Disposition: form-data; Name = "file"; filename = "file1.txt" Da: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 –

+0

hm, credo che sia così, ma non riesco a trovare alcuna traccia di "Content-Disposition" nel codice a graffetta durante l'apertura. –

+1

Ah, mi dispiace. Vedo cosa stai chiedendo ora. Modificherò la risposta per includere il modo in cui i binari ottengono il nome del file. – mckeed

Problemi correlati