Вопрос

В 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 делает именно то, что вы хотите.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top