• 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
    
  • 相关阅读:
    如何删除或更改已经释放的TR
    [问题解决]调用BAPI_ACC_DOCUMENT_POST时报错“被合并的公司 XXXX 和 XXXX 是不同的”
    如何判断暂存采购订单(EKKO-MEMORY)
    Django之HttpRequest和HttpReponse
    Django之模板继承
    Django之模板语法
    python库之selectors
    python库之threading
    JDBC学习笔记(9)——DBUtils的使用
    XML学习笔记(1)--XML概述
  • 原文地址:https://www.cnblogs.com/he-qing-qing/p/14396865.html
Copyright © 2020-2023  润新知