flask之大文件下载

临近过年,一个人太无聊 了,遇到的问题就想想怎么解决

flask之大文件下载

  1. 起因公司因为新切网络,没法共享测试版本(十个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里
  1. 上面实现了,也可以下载了;但是遇到一个问题,大文件怎么也下载不下来。神奇一批;经过研究查阅,是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
原文地址:https://www.cnblogs.com/he-qing-qing/p/14396865.html