Как создать и загрузить zip-файл со списком изображений?
Здесь у меня есть список изображений с их url. Я хочу создать zip и сохранить все изображения в zip. После извлечения zip-файла мне нужны изображения в папке.
Что происходит с приведенным ниже кодом:
он создает zip и загружает, но когда я извлекаю zip файл, там так много папок
типа zipfoldername/home/user/my_project/img
и только внутри папки img есть файлы.
Я хочу, чтобы там было только zipfoldername/img
.
Также внутри папки img
в файлах нет изображений, там только image_url. Я хочу сохранить изображение из этого image url в извлеченном файле.
image_list = ['https://example.com/media/file1.jpg', 'https://example.com/media/file2.jpg']
folder = os.path.join(settings.BASE_DIR, "imgs")
if not os.path.exists(folder):
os.mkdir(folder)
for i, imgfile in enumerate(image_list):
with open(os.path.join(folder, str(i)), 'wb+') as f:
f.write(imgfile)
response = HttpResponse(content_type='application/zip')
s = StringIO.StringIO()
zip_file = zipfile.ZipFile(s, "w")
folder_files = os.listdir(folder)
for filename in folder_files:
file = os.path.join(folder, filename)
zip_file.write(file)
zip_file.close()
resp = HttpResponse(s.getvalue(), content_type = "application/x-zip-compressed")
resp['Content-Disposition'] = 'attachment; filename=gik.zip'
return resp
Используя os
для получения имени файла и используя writestr
для записи байтов загруженного файла в zip-файл
import os
import zipfile
import requests
images = [
"https://via.placeholder.com/350x150.jpg",
"https://via.placeholder.com/350x250.jpg",
]
with zipfile.ZipFile('someZipFile.zip', 'w') as img_zip:
for image_url in images:
img_name = os.path.basename(image_url)
img_data = requests.get(image_url).content
img_zip.writestr(img_name, img_data)
Если вам нужна папка с именем img
внутри папки zip, вы можете изменить:
img_zip.writestr(img_name, img_data)
to
img_zip.writestr(f"img/{img_name}", img_data)
Если вы возвращаете архив в HTTP-ответе, вы можете сохранить его в буфер, а затем ответить буфером
buffer = io.BytesIO()
with zipfile.ZipFile(buffer , 'w') as img_zip:
...
response = HttpResponse(buffer.getvalue())
response['Content-Type'] = 'application/x-zip-compressed'
response['Content-Disposition'] = 'attachment; filename=file.zip'
return response