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

6
如果一个使用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扩展名,尽管它已经完整且完全可用。)
有什么最好的方法可以修复这个问题和其他我可能还不知道的错误吗?
我没有发送哪些头信息呢?
谢谢!

3
"没有一个浏览器知道文件的名字,因此它们会使用随机或默认的名称。"这个问题可以通过Content-Disposition头处理解决,参考链接是http://www.ietf.org/rfc/rfc2183.txt。" - rnicholson
2个回答

6

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

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

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

1

如果您不必返回响应正文(即,如果您的框架为响应正文提供了流),则可以使用以下方式避免在内存中保存文件:

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

你正在使用哪个Web框架?

我正在使用webpy。由于它似乎没有暴露文件描述符,所以我的猜测是我可以慢慢地生成文件? - user12163
1
似乎正是web.py作者推荐的做法:http://webpy.org/cookbook/streaming_large_files - dcrosta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接