前置知识
在内存中读写
BytesIO()
操作二进制数据,就需要使用BytesIO。
BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:
写入的不是str,而是经过UTF-8编码的bytes
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
'''
b'\xe4\xb8\xad\xe6\x96\x87'
'''
StringIO()
StringIO顾名思义就是在内存中读写str
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:
from io import StringIO
f = StringIO()
f.write('hello')
f.write(' ')
f.write('world!')
print(f.getvalue())
'''
hello world!
'''
getvalue()方法用于获得写入后的str。
要读取StringIO,也可以用一个str初始化StringIO,然后,像读文件一样读取:
from io import StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
while True:
s = f.readline()
if s == '':
break
print(s.strip())
'''
Hello!
Hi!
Goodbye!
'''
flask自带的make_response
make_response很强大,下载一个文件,需要在response的headers里边添加一些信息,比如文件的类型,文件的名字,是否以附件形式添加,这3个是比较关键的信息
代码实现
下面的代码供参考
from flask import Flask, make_response
from io import BytesIO
server = Flask(__name__)
@server.route("/download", methods=['post'])
def downloadFile():
# 操作二进制数据
output = BytesIO()
output.write('xxx'.encode('utf-8'))
# output.getvalue(): 文件的数据流
response = make_response(output.getvalue())
# 下载文件
response.headers["Cache-Control"] = "no-cache"
# 文件是excel类型的,后面的值可以设置为mime_type
response.headers['Content-Type'] = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
# 文件名
response.headers["Content-Disposition"] = "attachment;filename=receiptDataAnalyze.xlsx"
return response
if __name__ == "__main__":
server.run(host='127.0.0.1', port=88)
如果是中文的文件名需要进行转码
utf_filename=quote(basename.encode('utf-8'))