Flask - 发送 zipfile 包含绝对路径

问题描述

我的flask应用有一个功能,可以将目录中的日志文件压缩成zip文件,然后将文件发送给用户下载。压缩工作,除了当客户端收到 zipfile 时,zip 包含一系列文件夹,这些文件夹与服务器中压缩的原始文件绝对路径相匹配。但是,在服务器静态文件夹中制作的 zipfile 没有。

静态文件夹中的压缩文件内容:"log1.bin,log2.bin"

发送给用户的压缩文件内容:“/home/user/server/data/log1.bin,/home/user/server/data/log2.bin”

我不明白为什么使用“send_file”似乎会对 zip 文件内容进行此更改,并使用子文件夹填充收到的 zip 文件。接收到的 zip 文件的实际内容实际上与发送的 zip 文件内容在数据上是匹配的,但是用户必须点击多个目录才能找到这些文件。我做错了什么?

@app.route("/download")
def download():
    os.chdir(data_dir)
    if(os.path.isfile("logs.zip")):
        os.remove("logs.zip")
    log_dir = os.listdir('.')
    log_zip = zipfile.ZipFile('logs.zip','w')
    for log in log_dir:
        log_zip.write(log)
    log_zip.close()
    return send_file("logs.zip",as_attachment=True)

解决方法

使用 send_from_directory(directory,"logs.zip",as_attachment=True) 修复了所有问题。看来这个调用更适合提供静态文件。