前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python ZipFile: output zip file,ByteIO

python ZipFile: output zip file,ByteIO

原创
作者头像
刀枪不入de王二花
发布2022-08-25 17:53:43
7860
发布2022-08-25 17:53:43
举报
文章被收录于专栏:BETTERBETTER

python 3.9

zipFile出力

结论:

  • 利用【zipfile】包
代码语言:javascript
复制
import io
import zipfile

  • 直接写入指定文件中:
代码语言:javascript
复制
with zipfile.ZipFile(temp_path ,mode='w')as f:
    f.write(file)
  • 返回ByteIO
代码语言:python
复制
buffer = io.BytesIO()
    # param1:写入对象 buffer
    # param2:mode write
    # param3:compression default'ZIP_STORED(no compression)
zip_file = zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED)
with zip_file:
    # param1:zip file name
    # param2:bytes file
    zip_file.writestr(str_file_name, file.read())
return buffer

详细例

1,直接写入到文件中

代码语言:python
复制
import io
import urllib.parse
import zipfile

def write_file_to_zip(zip_name:str, files:List[str], md="w"):
    """
    args:
        zip_name: output zip file name
        files   : file path list, e.g.['C://temp//a.pdf','C://temp//b.pdf']
        md      : mode w:write, a:append 追加到既存的zip
    """
    try:
        # zip file path 指定,直接保存到指定的路径下
        temp_path = os.path.join(settings.UPLOAD_FOLDER, zip_name)
        
        with zipfile.ZipFile(temp_path ,mode=md) as f:
            for file in files:
                f.write(file)
        #with 结束后,f.close()自动执行,文件保存完毕

        # 若需要返回response-------------------------------------------start------------
        # encode file name
        quoted_filename = urllib.parse.quote(zip_name)
        response = HttpResponse(open(temp_path, 'rb').read())
        response['Content-Type'] = 'application/x-zip-compressed'
        response['Content-Disposition'] = f"attachment;  filename={quoted_filename}"
        return response
        # 若需要返回response-------------------------------------------end--------------
    except Exception as e:
        print("異常タイプ:%s"%type(e))
        print("異常内容:%s"%e)

2,不保存文件,返回【BytesIO】

代码语言:python
复制
import io
import urllib.parse
import zipfile

def write_file_to_zip(files:List[object]):
    """zip output \n
    return BytesIO without download
    args:
        files: [filename:str, file:BytesIO/BufferedReader]
    """
    try:
        buffer = io.BytesIO()
        # param1:写入对象 buffer
        # param2:mode write
        # param3:compression default'ZIP_STORED(no compression)
        zip_file = zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED)
        with zip_file:
            for file in files:
                # param1:zip file name
                # param2:bytes file
                zip_file.writestr(file[0], file[1].read())
        return buffer


↑ 调用
def test():
    # 任意文件路径 例'C://temp//a.pdf'
    file_path = os.path.join(settings.UPLOAD_FOLDER, 'folder', 'filename.pdf')
    if os.path.exists(file_path):
        f = open(file_path, 'rb')

    # 调用
    buffer = write_file_to_zip(['arcname.pdf', f])
    
    #--直接写入文件---------------------------------------start-----------------
    f = open('test.zip',"wb")
    f.write(buffer.getbuffer())   # buffer.getvalue() 也可
    f.close()
    #--直接写入文件---------------------------------------end-------------------
    
    #--返回前端----------------------------response------start-----------------
    # レスポンスの設定
    response = HttpResponse(buffer.getvalue())
    response['Content-Type'] = 'application/x-zip-compressed'
    # ダウンロードするファイル名
    quoted_filename = urllib.parse.quote(filename)
    response['Content-Disposition'] = f"attachment;  filename={quoted_filename}"
    return response
    #--返回前端-----------------------------response------end-------------------


##Django利用(js参照)

代码语言:javascript
复制
//button click
$('#btn-dl').on("click", function(e){
    e.preventDefault();
    let url = '{% url "app:data_dl" %}'
    
    let selected_rows = table.getSelectedRows();
    let id_list = [];
    selected_rows.forEach((el, idx, arr)=>{
        id_list.push(el.id);
    });
    
    file_download(url, id_list);
});


function file_download(url, id){
    let post_data = JSON.stringify({id});
    let oReq = new XMLHttpRequest();
    oReq.open("POST",url,true);
    oReq.setRequestHeader("Content-Type", "application/json");
    oReq.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    oReq.responseType = "blob";
    oReq.onload = function(eEvent){
        if (oReq.status == 200){
            var disposition = oReq.getResponseHeader('Content-Disposition');
            let download_name = disposition.split('filename=')[1];
            let file_name = decodeURI(download_name);
            let blob = oReq.response;
            let link = document.createElement("a");
            link.href = window.URL.createObjectURL(blob);
            link.download = file_name;
            link.click();
        }else{
            console.log("ファイルダウンロード失敗");
        }
    }
    oReq.send(post_data);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结论:
  • 详细例
    • 1,直接写入到文件中
      • 2,不保存文件,返回【BytesIO】
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档