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

Ste*_*n K 6 python 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()
        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)
Run Code Online (Sandbox Code Playgroud)

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

Bul*_*lat 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)
Run Code Online (Sandbox Code Playgroud)

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


dan*_*nny 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))
Run Code Online (Sandbox Code Playgroud)

编辑 - 根据api文档稍微清理一下代码

  • 更好的是,使用[`send_from_directory()`](https://flask.readthedocs.org/en/latest/api/#flask.send_from_directory). (3认同)