这是我的烧瓶服务器正在运行的代码:
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字节,下载的文件中没有数据。我尝试添加内容长度标头,但没有成功。不知道还能是什么。
正如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
)的。
这个头所做的只是告诉浏览器将响应数据视为具有特定名称的可下载文件。它实际上没有设置任何响应数据,这就是它为空的原因。
您需要在响应上设置文件内容才能使其工作。
@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))
EDIT-基于api文档清理了一些代码