Python 下载文件返回0字节

Python 下载文件返回0字节,python,flask,download,content-disposition,Python,Flask,Download,Content Disposition,以下是我的flask服务器正在运行的代码: 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

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

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)
从烧瓶导入烧瓶,做出响应
导入操作系统
app=烧瓶(名称)
@附件路线(“/”)
def index():
返回str(os.listdir(“.”)
@附件路线(“/”)
def getFile(文件名):
响应=作出响应()
响应.标题[“内容处置”]=“”\
“附件;文件名=%s”%file\u name
返回响应
如果名称=“\uuuuu main\uuuuuuuu”:
app.debug=True
应用程序运行(“0.0.0.0”,端口=6969)

如果用户访问该站点,它将打印目录中的文件。但是,如果您转到site:6969/filename,则应下载该文件。但是,我做了一些错误的事情,因为文件大小始终为0字节,而下载的文件中没有数据。任何想法。我尝试添加内容长度标题,但没有成功。不知道它还能是什么。

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

您需要在响应上设置文件内容才能使其工作

@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))
@app.route(“/”)
def getFile(文件名):
headers={“内容处置”:“附件;文件名=%s”%file\u name}
打开(文件名为“r”)作为f:
body=f.read()
返回make_响应((正文、标题))

编辑-根据danny所写的,稍微清理代码,您的响应中没有提供任何内容,这就是为什么您得到0字节。但是,Flask中有一个返回文件内容的简单函数:

from flask import send_file

@app.route("/<file_name>")
def getFile(file_name):
    return send_file(file_name, as_attachment=True)
从flask导入发送文件
@附件路线(“/”)
def getFile(文件名):
返回发送文件(文件名,如附件=True)

请注意,在本例中,
文件名
是相对于应用程序根路径(
app.root\u路径
)的。

这很有意义。然后再问一个问题。那么,上面的代码执行类似操作就没有什么区别了,对吗?:将open(file_name,'r')作为f:response=make_response(f.read())response.headers[“Content Disposition”]=“\”附件;filename=%s”%file_name返回响应。谢谢你,丹尼!是的,这应该行得通,你也可以直接将标题传递给
make_response
(我编辑了答案,应该与Flask 0.9+一起使用)。最后一个问题Danny。您在哪里发现响应对象具有内容方法。在编辑之前,您有“response.content(“content goes here.”)”,我在这里查看了一下,但找不到任何有关它的文档。更不用说我用response.content=“foo”尝试了您的旧解决方案,但该解决方案不起作用,所以我假设它已被弃用。示例和api文档中显示的新解决方案可以正常工作。谢谢更好的方法是使用。是的,听起来不错。或者像上面评论中提到的Martijn Pieters一样,也可以工作。谢谢