python压缩文件,Django下载zip文件

python压缩文件

  • 使用zipfile

    import zipfile
    def convert_zip(zip_path, save_path):
        '''
        # zip_path 要压缩文件的路径
        # save_path 文件压缩后保存的路径
        '''
        local_path = os.path.join(zip_path, "x.xls")
        zip = zipfile.ZipFile(save_path, "w")  #  zipfile.ZIP_DEFLATED
        zip.write(local_path, 'x.xls')
        zip.close()
    
    convert_zip(zip_path, save_path)
    

Django下载zip文件

  • Django使用临时文件夹tempfile下载其他文件,并压缩为zip文件返回给前端

  • 使用BytesIO()tempfile下载

    import io
    def contract_download(download_urls):
        '''
        downloads_urls 要批量下载并且压缩的文件
        '''
        # 创建BytesIO
        s = io.BytesIO()
        # 创建一个临时文件夹用来保存下载的文件
        temp = tempfile.TemporaryDirectory()
        # 使用BytesIO生成压缩文件
        zip = zipfile.ZipFile(s, 'w')
        for i in download_urls:
            f_name = "{}.pdf".format(i['name'])
            local_path = os.path.join(temp.name, f_name)
            # 下载文件
            ur.urlretrieve(i['download_url'], local_path)
            # 把下载文件的写入压缩文件
            zip.write(local_path, f_name)
        # 关闭文件
        zip.close()
        # 指针回到初始位置,没有这一句前端得到的zip文件会损坏
        s.seek(0)
        # 用FileWrapper类来迭代器化一下文件对象,实例化出一个经过更适合大文件下载场景的文件对象,实现原理相当与把内容一点点从文件中读取,放到内存,下载下来,直到完成整个下载过程。这样内存就不会担心你一下子占用它那么多空间了。
        wrapper = FileWrapper(s)
        response = HttpResponse(wrapper, content_type='application/zip')
        response['Content-Disposition'] = 'attachment; filename={}.zip'.format(datetime.datetime.now().strftime("%Y-%m-%d"))
        return response
    
    download_urls = [{"name":"pdf1","download_url": "http://xxx.pdf"}, {"name":"pdf2", "download_url": "http://xxx2.pdf"}]
    contract_download(download_urls)
    

本文链接:时光不写博客-Django下载zip文件

你可能感兴趣的:(Python)