Python Flask 下载文件返回0字节
这是我正在运行的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文档稍微整理了一下代码。