Python Flask下载文件返回0个字节

时间:2014-04-29 02:13:14

标签: python flask download content-disposition

以下是我的烧瓶服务器正在运行的代码:

from flask import Flask, make_response
import os

app = Flask(__name__)

@app.route("/")
def index():
        return str(os.listdir("."))

@app.route("/<file_name>")
def getFile(file_name):
        response = make_response()
        response.headers["Content-Disposition"] = ""\
        "attachment; filename=%s" % file_name
        return response    

if __name__ == "__main__":
        app.debug = True
        app.run("0.0.0.0", port = 6969)

如果用户访问该站点,则会在目录中打印文件。但是,如果你去网站:6969 / filename它应该下载文件。但是我做错了,因为文件大小总是0字节,下载的文件中没有数据。有什么想法吗。我尝试添加内容长度标头,但没有用。不知道它还能是什么。

2 个答案:

答案 0 :(得分:10)

正如danny所写,你没有在你的回复中提供任何内容,这就是你获得0字节的原因。但是Flask中有一个简单的函数send_file来返回文件内容:

from flask import send_file

@app.route("/<file_name>")
def getFile(file_name):
    return send_file(file_name, as_attachment=True)

请注意,在这种情况下,file_name与应用程序根路径(app.root_path)相关。

答案 1 :(得分:6)

所有标题都告诉浏览器将响应数据视为具有特定名称的可下载文件。它实际上没有设置任何响应数据,这就是为什么它是空白的。

您需要在响应中设置文件内容才能生效。

@app.route("/<file_name>")
def getFile(file_name):
    headers = {"Content-Disposition": "attachment; filename=%s" % file_name}
    with open(file_name, 'r') as f:
        body = f.read()
    return make_response((body, headers))

编辑 - 根据api docs

稍微清理一下代码