Python Flask 下载文件返回0字节

6 投票
2 回答
10221 浏览
提问于 2025-04-18 04:41

这是我正在运行的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)

当用户访问这个网站时,它会打印出目录中的文件。但是如果你访问 site:6969/filename,它应该下载这个文件。不过我好像做错了什么,因为下载的文件大小总是0字节,里面没有任何数据。你们有什么想法吗?我试着添加了内容长度的头部信息,但那也没用。我不知道还可以怎么做。

2 个回答

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)来说的。

7

这个头部信息的作用就是告诉浏览器,把返回的数据当作一个可以下载的文件,并指定一个名字。其实它并没有设置任何返回的数据,所以看起来是空的。

要让它正常工作,你需要在返回中设置文件的内容。

@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文档稍微整理了一下代码。

撰写回答