繁体   English   中英

Zip 一个文件夹但存储在 Flask 的变量中?

[英]Zip a Folder But Store In a Variable to Flask?

我有一段代码在临时目录的 for 循环中创建文件。

但是,我的目标是将它们 zip 起来,但不是将压缩文件存储在磁盘上,而是将其存储在变量中。 这是我的代码: https://pastebin.com/ZTbghf8S

此代码将位于 class 中,我会将其从 Flask web 服务器提供给用户,如下所示:

@app.route("/download_file")
def downloadfile():
    Object = MyClass(variable='random_variable')
    return Response(Object.getFile()['object'])

我该怎么做?

我之前回答过一个问题来做类似的事情,尽管它似乎已被删除。 我想出了这个以压缩 PIL 图像为主题的要点,但概念是相似的。

目标是在 memory 中构建一个 Z4348F938BDDDD8475E967CCB47ECB234Z 文件,并与 Flask 一起服务,而无需将其写入服务器上的磁盘。

要使其适应您的代码,您可以创建一个 function 来处理ans并返回一个元组,其中第一项是 output 路径,第二项是 BytesIO ZA8CFDE6331BD4B66AC96F8911C。

import io, os

def process_individual(ans):
        codepath = ans.find("a", {"class": "panel-group-toggle"}).text.strip().split("/") #File path and name
        codeans = ans.find("code", {"class": "brush"}).text #The answer

        # return a compatible tuple
        return ( os.path.join(q,  f'{exer_id}_template', *codepath),
                 io.BytesIO(codeans.encode(encoding='UTF-8') )

并根据元组列表定义在 memory zip 中创建的业务 function。 这应该从第一项获取文件路径,并相应地在 zip 文件中创建该文件夹结构。

import zipfile

def get_zip_buffer(list_of_tuples):
    zip_buffer = io.BytesIO()
    
    # https://stackoverflow.com/a/44946732 <3   
    with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED, False) as zip_file:
        for file_name, data in list_of_tuples:
            zip_file.writestr(file_name, data.read())

    zip_buffer.seek(0)
    return zip_buffer

要将其放在 Flask 中,您可能有如下下载路径:

@app.route('/downloader')
def download():
    list_of_tuples = [process_individual(a) for a in individual_ans]
    buff = get_zip_buffer(list_of_tuples)
    
    return send_file(buff,
                     mimetype='application/zip',
                     as_attachment=True,
                     attachment_filename='memoryzip.zip')

我尚未使用您的输入数据对此进行测试,因此可能需要稍作调整。 希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM