2008-12-09 3 views
1

Редактировать: Как вернуть/обслуживать файл с контроллера python (back end) через веб-сервер с именем файла? как предложено @JVОбратный файл из модуля python

+0

вопрос является неполным, я думаю. Действительно ли u означает возврат/подачу файла с контроллера python (back end) через веб-сервер с правильным набором и именем типа mime? – 2008-12-09 10:51:03

+0

Это не имеет ничего общего с Python. Это вопрос о типе возвращаемого HTTP. Как установить тип возврата зависит от вашего веб-сервера. Какую структуру веб-сервера вы используете? – 2008-12-09 11:03:20

+0

@ S.lott - Я использую черри. как отправить имя файла с помощью вишневого ответа? – 2008-12-09 11:08:45

ответ

1

Полностью поддерживается в CherryPy с использованием

from cherrypy.lib.static import serve_file 

Как указано в CherryPy docs - FileDownload:

import glob 
import os.path 

import cherrypy 
from cherrypy.lib.static import serve_file 


class Root: 
    def index(self, directory="."): 
     html = """<html><body><h2>Here are the files in the selected directory:</h2> 
     <a href="index?directory=%s">Up</a><br /> 
     """ % os.path.dirname(os.path.abspath(directory)) 

     for filename in glob.glob(directory + '/*'): 
      absPath = os.path.abspath(filename) 
      if os.path.isdir(absPath): 
       html += '<a href="/index?directory=' + absPath + '">' + os.path.basename(filename) + "</a> <br />" 
      else: 
       html += '<a href="/download/?filepath=' + absPath + '">' + os.path.basename(filename) + "</a> <br />" 

     html += """</body></html>""" 
     return html 
    index.exposed = True 

class Download: 
     def index(self, filepath): 
     return serve_file(filepath, "application/x-download", "attachment") 
     index.exposed = True 

if __name__ == '__main__': 
    root = Root() 
    root.download = Download() 
    cherrypy.quickstart(root) 
2

Вы можете либо передать ссылку на сам файл, т. е. полный путь к файлу. Затем вы можете открыть файл или иным образом манипулировать им.

Или, что более нормальным случаем является передача дескриптора файла и использование стандартных операций чтения/записи в дескрипторе файла.

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

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

0

Для получения информации о типах MIME (которые, как загрузка бывает) , начинаются здесь: Properly Configure Server MIME Types.

Для получения информации о CherryPy ознакомьтесь с атрибутами объекта Response. Вы можете установить content type ответа. Кроме того, вы можете использовать tools.response_headers для установки типа содержимого.

И, конечно, есть пример File Download.