2009-05-31 3 views
1

В cherrypy.lib.static.py есть метод:serve_file для любого объекта файла

serve_file(path, content_type=None, disposition=None, name=None) 

где аргумент «путь» должен быть реальный файл (абсолютный путь). Есть ли что-то подобное для работы с любым файловым объектом Python?

+0

Функция serve_fileobj отлично работает для этого. (Было бы полезно для сообщества, если бы вы приняли правильный ответ.) –

ответ

3

От изучения http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py я должен был бы сказать, нет: функция serve_file не является «монолитной», и делает свой собственный bodyfile = open(path, 'rb'), и не кажется, есть какой-нибудь другой способ. Жаль, так как было бы легко реорганизовать функцию и добавить другую, например. serve_open_file, чтобы покрыть ваш случай, имея как делегат для внутренней функции для «жесткой» логики, например, как multipart/byteranges. Возможно, стоит потратить время, чтобы открыть запрос функции («билет на повышение») на cherrypy.org - не может быть функцией убийцы, но я вижу примеры использования, и реализовать это будет не сложно для людей, живущих в черри (посетите their site и следуйте инструкциям на странице, чтобы «войти» в нее).

+1

Если я правильно понял, я думаю, что этот ответ больше не верен, с добавлением метода 'serve_fileobj'. –

+0

Да, serve_filobj делает именно то, что хочет OP. (Этот ответ устарел.) –

0

Если посмотреть на http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py, это выглядит как serve_fileobj делает именно то, что вы хотите.

Редактировать: Я пробовал это сейчас, и он только отображает содержимое файла на экране, а не позволяет загружать файл.

2

До тех пор, пока ваш файл или подобный файлу объект итерабельен, просто верните его из функции обработчика вместо строки.

Update:

Служить его как скачать, установить заголовки Content-Type и Content-Disposition следующим образом:

cherrypy.response.headers["Content-Type"] = "application/x-download" 
cd = 'attachment; filename="%s"' % name 
cherrypy.response.headers["Content-Disposition"] = cd 

Или используйте функцию serve_fileobj в последних версиях cherrypy/lib/static.py , что делает это для вас и многое другое.

+0

Это работает, если вы хотите отобразить содержимое файла на экране. Есть ли способ разрешить загрузку файла? –

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