Как отправить файл через HTTP, хороший способ, используя Python? - PullRequest
5 голосов
/ 19 сентября 2009

Если потенциальный HTTP-сервер, написанный на Python2.6, имеет локальный доступ к файлу, каков будет наиболее правильный способ для этого сервера вернуть файл клиенту по запросу?

Допустим, это текущая ситуация:

header('Content-Type', file.mimetype)
header('Content-Length', file.size) # file size in bytes
header('Content-MD5', file.hash)    # an md5 hash of the entire file

return open(file.path).read()

Все файлы представляют собой архивы .zip или .rar размером не более пары мегабайт.

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

Каков наилучший способ исправить эту и другие ошибки, о которых я даже не подозреваю?

Какие заголовки я не отправляю?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 19 сентября 2009

Вот так я отправляю ZIP файл,

    req.send_response(200)
    req.send_header('Content-Type', 'application/zip')
    req.send_header('Content-Disposition', 'attachment;'
                    'filename=%s' % filename)

Большинство браузеров справляются с этим правильно.

1 голос
/ 19 сентября 2009

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

fp = file(path_to_the_file, 'rb')
while True:
    bytes = fp.read(8192)
    if bytes:
        response.write(bytes)
    else:
        return

Какой веб-фреймворк вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...