2010-04-13 2 views
10

я начал использовать модуль Nginx загрузки (который создает закачивать файлы как/TMP/000121545), но мне нужно скрепку использовать оригинальное имя файла при сохранении файлов (например, /public/avatars/LuckyLuke.jpg)где от paperclip получить имя оригинального файла?

ранее параметров Rails проходили только

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

не оригинальное имя файла, так что мне интересно, откуда она приходит в скрепку? Я пробовал просматривать код плагина, но в настоящее время он слишком сложный для меня.

ответ

19

Браузер отправляет http-заголовок с именем файла. («Content-Disposition: filename = original_file.jpg»)

Rails делает это доступным как метод экземпляра временного файлового объекта: params[:avatar].original_filename, а paperclip использует это.

Подробно, Rack анализирует многостраничную форму в Rack :: Utils :: Multipart :: UploadedFile и помещает хэш в параметры, которые включают :tempfile и :filename. Затем ActionDispatch :: Http :: Upload приходит и заменяет этот хэш объектом File (значение: tempfile), расширяя его с помощью модуля ActionDispatch :: Http :: UploadedFile, который добавляет переменную экземпляра для original_path и метод original_filename.

+0

Yap, это Content-Disposition: form-data; Name = "файлы"; filename = "file1.txt" От: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 –

+0

hm, я считаю, что это так, но не может найти следов «Content-Disposition» в коде скрепки, в то время как grepping. –

+1

Ах, извините. Я вижу, что ты сейчас спрашиваешь. Я отредактирую ответ, чтобы указать, как рельсы получают имя файла. – mckeed

Смежные вопросы