【问题标题】:Downloading multiple files in Flask在 Flask 中下载多个文件
【发布时间】:2021-11-08 10:05:36
【问题描述】:

我正在尝试为客户端提供在 Flask 中下载某些文件的选项。用户/客户端可以下载多个文件或单个文件。

但是我不明白如何为用户提供下载多个文件的选项。

这是我迄今为止尝试过的:


@app.route('/download_files')
def download():
    count=0
    download_list=[]
    for path in pathlib.Path("dir1/dir2").iterdir():
        if path.is_file():
            for i in names:
                if pathlib.PurePosixPath(path).stem == i:
                    count += 1
                    download_list.append(path)
    return send_file(download_list, as_attachment=True, mimetype="text/plain", download_name="Downloaded Files", attachment_filename="Generated Files")

即使使用单个文件,这也无法正常工作。我要下载的文件类型是扩展名为 .sql 的文本文件。

我是否必须以某种方式压缩多个文件,然后提供下载选项?请指导我的可用选项。

【问题讨论】:

    标签: python html file flask download


    【解决方案1】:

    为了将多个文件一起提供下载,您只能选择将它们压缩到存档中。
    在我的示例中,所有与指定模式匹配的文件都被列出并压缩在一个 zip 存档中。这是写入内存并由服务器发送。

    from flask import Flask
    from flask import send_file
    from glob import glob
    from io import BytesIO
    from zipfile import ZipFile
    import os
    
    app = Flask(__name__)
    
    @app.route('/download')
    def download():
        target = 'dir1/dir2'
    
        stream = BytesIO()
        with ZipFile(stream, 'w') as zf:
            for file in glob(os.path.join(target, '*.sql')):
                zf.write(file, os.path.basename(file))
        stream.seek(0)
    
        return send_file(
            stream,
            as_attachment=True,
            attachment_filename='archive.zip'
        )
    

    【讨论】:

      【解决方案2】:

      您尚未提供实际获取这些文件或此文件的代码示例。最小的工作示例是这样的:

      from flask import Flask, request
      
      app = Flask(__name__)
      
      @app.route('/download_files', methods=['POST'])
      def download():
          file = request.files['file'] # for one file
          files = request.files.getlist("file[]") # if there're multiple files provided
      
      if __name__ == "__main__":
          app.run()
      

      在您的 file 变量将成为werkzeug.FileStorage 的对象之后,files 变量将成为这些对象的列表。 要下载所有这些文件,您可以查看question

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多