直接下载文件
import bottle
import sys
import os
import logging
import urllib.parse
from bottle import error,route, default_app, get, run, request, hook, response, static_file
import json
#def to_json(obj):
# return json.dumps(obj,ensure_ascii=False)#防止中文乱码
@get('/api/filedownload/')#<filename>
def file_download():#filename
#def send_chunk(): # 流式读取
print('start')
fname='测试test.csv'
store_path = 'F:/vs/stocks/stock_basic_list.csv'#%s' % filename
response.set_header('Content-Type', 'application/octet-stream')
response.set_header('Content-Disposition','attachment;filename="{}"'.format(fname))
response.set_header('Tansfer-Encoding','chunked')
with open(store_path, 'rb') as target_file:
while True:
chunk = target_file.read(20 * 1024 ) #* 1024 每次读取20M
print(len(chunk))
if not chunk:
break
yield chunk
#return b'abcde'
# 函数主入口
if __name__ == '__main__':
#加入session插件
run(app=default_app(), host='0.0.0.0', port=9090, debug=True, reloader=True)
动态生成excel并下载
def callback():
"""
获取列表数据
"""
# 实例化phcodes表操作类CurrFlowLogic
_phcodes = base_logic_codes.Codes_Logic()
sqlstr='SELECT A.id, A.telcode as 预选号, A.isowner as 是否已选, B.orgname as 单位, A.uname as 姓名, A.uphone as 联系方式, A.slttm as 预选时间, C.packagename as 套餐,D.jtbmc as 集团包 \
FROM public.tbl_phonecodes A left join tbl_org B on A.orgid=B.id left join tbl_package C on A.packageid=C.id left join tbl_jtb D on A.jtbid=D.id where A.id<>147 order by A.id'
result = _phcodes.select(sqlstr)
df=pd.DataFrame(result)
#print(df)
tm=datetime.datetime.now().strftime('%Y-%m-%d_%H%M%S')
fname='选号记录导出'+tm+'.xlsx'
utf_filename=quote(fname.encode('utf-8'))#防止不同浏览器乱码
response.set_header('Content-Type','application/octet-stream;charset=utf-8')
#response.add_header('Content-Type','text/html;charset=utf-8')
response.set_header('Content-Disposition','attachment;filename="{}"'.format(utf_filename))
#response.set_header('Transfer-Encoding','chunked')
fpath=NamedTemporaryFile()#(mode='w+t',delete=True)#,encoding='utf-8-sig'
#print(fpath.name)
#bytes_data_io = io.BytesIO()
#fpath=io.StringIO()#io.BytesIO()#'e:/tt.csv'openpyxl
#-----------csv格式文件,注意修改上面的扩展名
#df.to_csv(fpath, sep=',',header=True,na_rep='',line_terminator='\n',encoding='utf-8-sig', index=False)
#========== line_terminator,windows下默认是‘\r\n’会有空行。encoding='utf-8-sig'才不会乱码
#------------ xlsx格式文件
df['预选时间']= pd.to_datetime(df['预选时间'].values, utc=None,format='%Y-%m-%d %H:%M:%S', unit='s')# csv 格式不用此转换
df.to_excel(fpath,sheet_name='Sheet1',engine='xlsxwriter', header=True,freeze_panes=(1,3),na_rep='',encoding='utf-8-sig', index=False)
#==========
fpath.seek(0)
while True:
chunk = fpath.read(20*1024)#*1024
#print(len(chunk))
if not chunk:
fpath.close()
break
yield chunk
文章永久链接:https://tech.souyunku.com/42135