serv_file для любого файлового объекта
-
06-09-2019 - |
Вопрос
В Cherrypy.lib.static.py есть метод:
serve_file(path, content_type=None, disposition=None, name=None)
где аргумент «путь» должен быть реальным файлом (абсолютный путь).Есть ли что-то подобное для обслуживания любого файлового объекта Python?
Решение
От учебы http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py Я бы сказал, нет:тот serve_file
функция является «монолитной» и выполняет свою собственную bodyfile = open(path, 'rb')
, и, похоже, не существует альтернативного пути.Жаль, так как было бы легко провести рефакторинг функции и добавить другую, например. serve_open_file
чтобы охватить ваш случай, оба делегируют внутреннюю функцию для «жесткой» логики, такой как обслуживание multipart/byteranges.Возможно, вам стоит потратить время на открытие запроса на функцию («запрос на улучшение») на Cherrypy.org — возможно, это не убийственная функция, но я вижу варианты использования, и реализовать ее не составит труда для людей Cherrypy (посетите их сайт и следуйте инструкциям на странице, чтобы «войти» в нее).
Другие советы
Пока ваш файл или файловоподобный объект является итеративным, просто верните его из функции-обработчика вместо строки.
Обновлять:
Чтобы использовать его для загрузки, установите заголовки 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
, который сделает это и многое другое.
Новый взгляд на http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py, это выглядит как serve_fileobj
делает именно то, что вы хотите.
Редактировать:Я попробовал это сейчас, и он только отображает содержимое файла на экране, а не позволяет загрузить файл.