serve_file для любого файлового объекта - PullRequest
1 голос
/ 01 июня 2009

В cherrypy.lib.static.py есть метод:

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

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

Ответы [ 3 ]

3 голосов
/ 01 июня 2009

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

2 голосов
/ 12 сентября 2011

Пока ваш файл или файловый объект является итеративным, просто возвращайте его из функции-обработчика вместо строки.

Обновление:

Чтобы загрузить его, установите заголовки 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 голосов
/ 08 сентября 2011

Новый взгляд на http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py, выглядит так: serve_fileobj делает именно то, что вы хотите.

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

...