如何使用Python以正确方式通过HTTP发送文件?

6 投票
2 回答
10562 浏览
提问于 2025-04-15 14:25

如果一个用Python2.6写的HTTP服务器可以访问本地文件,那么这个服务器在客户请求文件时,最正确的返回方式是什么呢?

假设现在的情况是这样的:

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 个回答

1

如果你不需要返回响应的内容(也就是说,如果你的框架给你提供了一个响应内容的流),你可以用下面这种方法来避免把文件放在内存里:

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

你在使用哪个网页框架呢?

6

这是我发送ZIP文件的方法,

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

大多数浏览器都能正确处理它。

撰写回答