flask BytesIO() 多個文件打包下載 zipfile


使用zipfile模塊可以將多個文件打包成zip文件進行下載,但是常規的操作方式會在服務器磁盤上生成一個zip文件占用磁盤空間。

后引入BytesIO將文件寫入到內存中然后下載:

def dl_plan(pid):
    """
    下載測試計划關聯的測試文件,分單個和多個文件情況(多個文件打包成zip下載)。
    1. 計划只有一個文件則直接下載.xlsx文件
    2. 計划有多個文件,則打包成zip通過BytesIO直接寫入到內存中,不在本地生成.zip文件。
    :param pid
    :return:
    """
 
    dirpath = Config.FILE_UPLOAD_DIR
    tp = TestPlan.objects.get_or_404(id=pid)
    fp_test_files = tp.test_files
    file_list = fp_test_files.split(",")
    dl_name = '{}.zip'.format(tp.planname)
 
    if len(file_list) == 1:
        return send_from_directory(dirpath, fp_test_files, as_attachment=True)
    else:
        memory_file = BytesIO()
        with zipfile.ZipFile(memory_file, "w", zipfile.ZIP_DEFLATED) as zf:
            for _file in file_list:
                with open(os.path.join(dirpath, _file), 'rb') as fp:
                    zf.writestr(_file, fp.read())
        memory_file.seek(0)
        return send_file(memory_file, attachment_filename=dl_name, as_attachment=True)

大體的代碼就是這些


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM