• Flask 下载时数据流的返回


    Flask 下载时数据流的返回


    关于flask 的下载功能实现,网上有一大堆,大致上是这样(适用于预下载的文件就在你的服务器里)

    from flask import jsonify, json, request, make_response, Response, stream_with_context, send_file
    import mimetypes
    
    @api.route("/downloadFile/<path:filename>")
    def downloadFile(filename):
        import os
        baseDir = os.path.join(os.getcwd(), "static")
        pathname = os.path.join(baseDir, filename)
        print pathname
        def send_chunk():  # 流式读取
            store_path = pathname
            with open(store_path, 'rb') as target_file:
                while True:
                    chunk = target_file.read(20 * 1024 * 1024)  # 每次读取20M
                    if not chunk:
                        break
                    yield chunk
        return Response(send_chunk(), content_type='application/octet-stream')
    
    
    @api.route("/downloadFile2/<path:filename>")
    def downloadFile2(filename):
        import os
        baseDir = os.path.join(os.getcwd(), "static")
        pathname = os.path.join(baseDir, filename)
        f = open(pathname, "rb")
        response = Response(f.readlines())
        # response = make_response(f.read())
        mime_type = mimetypes.guess_type(filename)[0]
        response.headers['Content-Type'] = mime_type
        response.headers['Content-Disposition'] = 'attachment; filename={}'.format(filename.encode().decode('latin-1'))
        return response

    但是我遇到的情况是下载的文件不在本地服务器,所以按上面的逻辑的话,我需要自己先下载好了才能传输给用户,可以说有点蠢

    所以经过研究,发现了一种解决办法(跳过自己下载好了再传输的尴尬,直接将请求到的数据返回给用户)

    from werkzeug._compat import wsgi_encoding_dance

    @app.route("/downloadFile/<hash_str>") def download_file(hash_str): song = get_download_link(hash_str) # 首先定义一个生成器,每次读取512个字节 def generate(): if song['url']: r = requests.get(song['url'], cookies=request.cookies, stream=True) for chunk in r.iter_content(chunk_size=512): if chunk: yield chunk response = Response(stream_with_context(generate())) name = wsgi_encoding_dance(FileName) # .encode("utf-8").decode("latin1") content_disposition = "attachment; filename={}".format(name) response.headers['Content-Disposition'] = content_disposition return response
  • 相关阅读:
    css3 文本超出后出现省略号
    Bootstrap 开关(switch)控件需要注意的问题
    angularJs 使用中遇到的问题小结【一:关于传参】
    ctrl+enter提交留言
    div a块状布局
    模态框 快速选定合适的布局
    ionic 项目分享No.2——简化版【转】
    jquery判断div是否显示或者隐藏
    phpsotrm 设置命名空间
    win10 cmd 替换 powershell
  • 原文地址:https://www.cnblogs.com/pywjh/p/13582011.html
Copyright © 2020-2023  润新知