2010-04-13 13 views
10

gestartet i nginx Upload-Modul (die Upload-Dateien wie/tmp/000.121.545 erstellt), aber ich brauche Büroklammer ursprünglichen Dateinamen zu verwenden, während das Speichern von Dateien (wie /public/avatars/LuckyLuke.jpg)woher erhält Paperclip den Namen der Originaldatei?

zuvor in den Parametern Rails wurden nur

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

kein original Dateiname auch, so frage ich mich woher woher kommt es in Büroklammer? Ich habe versucht, Plugin Code durchzusehen, aber es ist derzeit ein bisschen zu komplex für mich.

Antwort

19

Der Browser sendet einen HTTP-Header mit dem Dateinamen. ("Content-Disposition: filename = original_file.jpg")

Rails macht dies als Instanzmethode für das temporäre Dateiobjekt verfügbar: params[:avatar].original_filename, und Paperclip verwendet dies.

Im Detail analysiert Rack das mehrteilige Formular in Rack :: Utils :: Multipart :: UploadedFile und fügt einen Hash in die Parameter :tempfile und :filename ein. Dann kommt ActionDispatch :: Http :: Upload mit und ersetzt diesen Hash durch das File-Objekt (Wert von: tempfile) und erweitert es um das Modul ActionDispatch :: Http :: UploadedFile, das eine Instanzvariable für original_path und die Methode original_filename hinzufügt.

+0

Yap, es ist Content-Disposition: Formulardaten; name = "Dateien"; filename = "file1.txt" Von: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 –

+0

hm, ich glaube es ist so, aber finde keine Spur von "Content-Disposition" im Büroklammer-Code beim Greppen. –

+1

Ah, Entschuldigung. Ich sehe was du jetzt fragst. Ich bearbeite die Antwort, um einzuschließen, wie Schienen den Dateinamen erhält. – mckeed

Verwandte Themen