Jos*_*h.h 3 python zip sendfile flask
我在尝试使用 Flask send_file 下载内存 ZIP-FILE 对象时遇到问题。我的 zip 存在于内存中并且充满了文本文档,但是当我尝试使用此代码时,我得到的结果是:它按预期下载,但下载的是一个空的 zip 文件!就像它没有复制任何内容......我不知道如何解决这个问题。
@app.route('/downloads/', methods=['GET'])
def download():
from flask import send_file
import io
import zipfile
import time
FILEPATH = r"C:\Users\JD\Downloads\trydownload.zip"
fileobj = io.BytesIO()
with zipfile.ZipFile(fileobj, 'w') as zip_file:
zip_info = zipfile.ZipInfo(FILEPATH)
zip_info.date_time = time.localtime(time.time())[:6]
zip_info.compress_type = zipfile.ZIP_DEFLATED
with open(FILEPATH, 'rb') as fd:
zip_file.writestr(zip_info, fd.read())
fileobj.seek(0)
return send_file(fileobj, mimetype='zip', as_attachment=True,
attachment_filename='%s.zip' % os.path.basename(FILEPATH))
Run Code Online (Sandbox Code Playgroud)
我对 Flask 方法有完全相同的问题send_file
。
详细信息:
Flask 版本2.0.1
操作系统:Windows 10
解决方案
我想出了一个解决方法,即代替方法,这可以通过返回带有数据的对象send_file
来完成。将代码中的语句Response
替换为以下内容,这应该可以工作。return
@app.route('/downloads/', methods=['GET'])
def download():
from flask import Response # Changed line
import io
import zipfile
import time
FILEPATH = r"C:\Users\JD\Downloads\trydownload.zip"
fileobj = io.BytesIO()
with zipfile.ZipFile(fileobj, 'w') as zip_file:
zip_info = zipfile.ZipInfo(FILEPATH)
zip_info.date_time = time.localtime(time.time())[:6]
zip_info.compress_type = zipfile.ZIP_DEFLATED
with open(FILEPATH, 'rb') as fd:
zip_file.writestr(zip_info, fd.read())
fileobj.seek(0)
# Changed line below
return Response(fileobj.getvalue(),
mimetype='application/zip',
headers={'Content-Disposition': 'attachment;filename=your_filename.zip'})
Run Code Online (Sandbox Code Playgroud)