临近过年,一个人太无聊 了,遇到的问题就想想怎么解决
flask之大文件下载
- 起因公司因为新切网络,没法共享测试版本(十个G左右),公司两个办公区域,A区可以非常麻溜的下载版本,B区网络几KB每秒。B区下不到版本,又要版本刷机完成测试任务,很是烦恼,没招就把手机从B拿到A刷机,一堆手续,很是费劲; 就想自己用flask在A起个服务 然后通过网页传输下载;代码如下
# pycharm 社区版 没法直接创建一个flask项目 都是手敲写的
# app.py
import os
from flask import Flask, Response, render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
fileNames=[]
obj = os.walk("static")
for root,dirname,filename in obj:
fileNames.append(filename)
return render_template("index.html",fileNames=fileNames[0])
@app.route("/download/<filename>")
def download(filename):
# 普通下载
store_path = "./static/"+filename
return send_from_directory(store_path, filename, as_attachment=True)
if __name__ == '__main__':
app.run(
host="192.168.1.128",
port="5000",
debug=True
)
#index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<style>
</style>
</head>
<body>
<h1>何庆青资源</h1>
{% for file in fileNames %}
<a href="/download/{{ file }}">下载:{{ file }}</a>
{% endfor %}
</body>
<script>
</script>
</html>
#需要下载的资源放static里
- 上面实现了,也可以下载了;但是遇到一个问题,大文件怎么也下载不下来。神奇一批;经过研究查阅,是send_from_directory这个方法没法传输太大文件,传输到一定大小又停止重新传输,导致大文件没法传输;然后改善下载代码如下,成功解决
def download(filename):
# 流式读取
def send_file():
store_path = "./static/"+filename
with open(store_path, 'rb') as targetfile:
while 1:
data = targetfile.read(20 * 1024 * 1024) # 每次读取20M
if not data:
break
yield data
response = Response(send_file(), content_type='application/octet-stream')
response.headers["Content-disposition"] = 'attachment; filename=%s' % filename # 如果不加上这行代码,导致下图的问题
return response