Как отправить zip-файлы в рамках python Flask?
У меня есть сервер flask, который захватывает двоичные данные для нескольких разных файлов из базы данных и помещает их в объект python 'zipfile'. Я хочу отправить сгенерированный zip-файл с моим кодом, используя метод "send_file" flask.
первоначально я мог успешно отправлять не zip-файлы, используя BytesIO (bin) в качестве первого аргумента для send_file, но по какой-то причине я не могу сделать то же самое с моим сгенерированным zip-файлом. Это дает ошибку:
'' делает не имеют буферного интерфейса.Как отправить этот объект zip-файла пользователю с помощью Flask?
Это мой код:
@app.route("/getcaps",methods=['GET','POST'])
def downloadFiles():
if request.method == 'POST':
mongo = MongoDAO('localhost',27017)
identifier = request.form['CapsuleName']
password = request.form['CapsulePassword']
result = mongo.getCapsuleByIdentifier(identifier,password)
zf = zipfile.ZipFile('capsule.zip','w')
files = result['files']
for individualFile in files:
data = zipfile.ZipInfo(individualFile['fileName'])
data.date_time = time.localtime(time.time())[:6]
data.compress_type = zipfile.ZIP_DEFLATED
zf.writestr(data,individualFile['fileData'])
return send_file(BytesIO(zf), attachment_filename='capsule.zip', as_attachment=True)
return render_template('download.html')
1 ответов
BytesIO()
необходимо передать байт, но a ZipFile()
объект не байт-данные; вы фактически создали файл на жесткий диск.
вы можете создать ZipFile()
в памяти с помощью BytesIO()
в качестве основания:
memory_file = BytesIO()
with zipfile.ZipFile(memory_file, 'w') as zf:
files = result['files']
for individualFile in files:
data = zipfile.ZipInfo(individualFile['fileName'])
data.date_time = time.localtime(time.time())[:6]
data.compress_type = zipfile.ZIP_DEFLATED
zf.writestr(data, individualFile['fileData'])
memory_file.seek(0)
return send_file(memory_file, attachment_filename='capsule.zip', as_attachment=True)
The with
заявление гарантирует, что ZipFile()
объект правильно закрыт, когда вы закончите добавлять записи, в результате чего он запишет необходимый трейлер в объект файла в памяти. The memory_file.seek(0)
звоните необходимо "перемотать" позицию чтения-записи объекта file обратно в начало.