问题描述
我的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)
修复了所有问题。看来这个调用更适合提供静态文件。