以下是我的烧瓶服务器正在运行的代码:
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字节,下载的文件中没有数据。有什么想法吗。我尝试添加内容长度标头,但没有用。不知道它还能是什么。
答案 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
稍微清理一下代码