ZIP-файл ответа от Django

Я пытаюсь загрузить img из URL-адреса, добавить его в zip-архив, а затем ответить на этот архив с помощью Django HttpResponse.

import os
import requests
import zipfile
from django.http import HttpResponse

url = 'http://some.link/img.jpg' 
file = requests.get(url)
data = file.content
rf = open('tmp/pic1.jpg', 'wb')
rf.write(data)
rf.close()
zipf = zipfile.ZipFile('tmp/album.zip', 'w') # This file is ok
filename = os.path.basename(os.path.normpath('tmp/pic1.jpg'))
zipf.write('tmp/pic1.jpg', filename)
zipf.close()
resp = HttpResponse(open('tmp/album.zip', 'rb'))
resp['Content-Disposition'] = 'attachment; filename=album.zip'
resp['Content-Type'] = 'application/zip'
return resp # Got corrupted zip file

Когда я сохраняю файл в папку tmp - все в порядке, я могу его извлечь. Но когда я отвечаю на этот файл, я получаю «Ошибка 1/2/21» в MacOS или Неожиданный EOF, если я пытаюсь открыть в редакторе Atom (только для проверки). Я также использовал StringIO вместо сохранения zip-файла, но это не влияет на результат.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
4 433
1

Ответы 1

Если вы используете Python 3, вы должны сделать это так:

import os, io, zipfile, requests
from django.http import HttpResponse

# Get file
url = 'https://some.link/img.jpg'
response = requests.get(url)
# Get filename from url
filename = os.path.split(url)[1]
# Create zip
buffer = io.BytesIO()
zip_file = zipfile.ZipFile(buffer, 'w')
zip_file.writestr(filename, response.content)
zip_file.close()
# Return zip
response = HttpResponse(buffer.getvalue())
response['Content-Type'] = 'application/x-zip-compressed'
response['Content-Disposition'] = 'attachment; filename=album.zip'

return response

Это без сохранения файла. Загруженный файл идет прямо на io.

Чтобы ответить на сохраненный файл, используйте этот синтаксис:

response = HttpResponse(open('path/to/file', 'rb').read())

Как я упоминал выше, я уже использовал io для создания файла. Но проблема в файле ответа, а не в созданном.

E. Mozz 23.01.2019 08:54

@E.Mozz: чтобы вернуть файл, добавьте .read() в open(), open('tmp/album.zip', 'rb').read()).

Borut 23.01.2019 10:02

Ничего не изменилось, все равно вылетает ошибка при попытке открыть архив.

E. Mozz 23.01.2019 10:10

Простое и лучшее решение. Большое спасибо.

Sathia 25.08.2021 19:12

Другие вопросы по теме