2010-04-13 5 views
10

i commencé à utiliser le module de téléchargement nginx (qui crée des fichiers de téléchargement comme/tmp/000121545) mais j'ai besoin d'utiliser le nom de fichier paperclip d'origine alors que l'enregistrement des fichiers (comme /public/avatars/LuckyLuke.jpg)D'où vient paperclip obtenir le nom du fichier original?

précédemment dans les paramètres Rails se passaient juste

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

aucun nom de fichier original, donc je me demande d'où vient-il à paperclip? J'ai essayé de regarder le code du plugin, mais c'est un peu trop complexe pour moi.

Répondre

19

Le navigateur envoie un en-tête http avec le nom du fichier. ("Content-Disposition: filename = fichier_original.jpg")

Rails le rend disponible comme méthode d'instance de l'objet fichier temporaire: params[:avatar].original_filename, et paperclip l'utilise.

En détail, Rack analyse la forme multipart dans Rack :: Utils :: Multipart :: UploadedFile et place un hachage dans les paramètres qui inclut :tempfile et :filename. Puis ActionDispatch :: Http :: Upload arrive et remplace ce hachage par l'objet File (valeur de: tempfile), en l'étendant avec le module ActionDispatch :: Http :: UploadedFile, qui ajoute une variable d'instance pour original_path et la méthode original_filename.

+0

Yap, c'est Content-Disposition: formulaire-données; name = "fichiers"; filename = "file1.txt" De: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 –

+0

hm, je crois que c'est le cas, mais ne trouve aucune trace de "Content-Disposition" dans le code de trèfle tout en grepping. –

+1

Ah, désolé. Je vois ce que vous demandez maintenant. Je vais modifier la réponse pour inclure comment les rails obtiennent le nom de fichier. – mckeed