Django:使用 django-storage 从 S3 创建 zipfile
Django: Create zipfile from S3 using django-storage
我使用 django-storages 并将与用户相关的内容存储在 S3 上的文件夹中。现在,我希望用户能够一次下载所有文件,最好是 zip 文件。之前所有与此相关的帖子都已过时或对我不起作用。
目前最接近工作的代码:
from io import BytesIO
import zipfile
from django.conf import settings
from ..models import Something
from django.core.files.storage import default_storage
class DownloadIncomeTaxFiles(View):
def get(self, request, id):
itr = Something.objects.get(id=id)
files = itr.attachments
zfname = 'somezip.zip'
b = BytesIO()
with zipfile.ZipFile(b, 'w') as zf:
for current_file in files:
try:
fh = default_storage.open(current_file.file.name, "r")
zf.writestr(fh.name, bytes(fh.read()))
except Exception as e:
print(e)
response = HttpResponse(zf, content_type="application/x-zip-compressed")
response['Content-Disposition'] = 'attachment; filename={}'.format(zfname)
return response
这会创建一个看起来像 zip 文件的文件,但它唯一的内容是“”
我得到了许多不同的结果,主要是错误,例如在提供 FieldFile 时 zipfile 需要字符串或字节内容。在这一点上我完全卡住了。
问题是我需要通过添加
恢复到文件开头
zf.seek(0)
就在 HttpResponse 中返回文件之前。
我使用 django-storages 并将与用户相关的内容存储在 S3 上的文件夹中。现在,我希望用户能够一次下载所有文件,最好是 zip 文件。之前所有与此相关的帖子都已过时或对我不起作用。
目前最接近工作的代码:
from io import BytesIO
import zipfile
from django.conf import settings
from ..models import Something
from django.core.files.storage import default_storage
class DownloadIncomeTaxFiles(View):
def get(self, request, id):
itr = Something.objects.get(id=id)
files = itr.attachments
zfname = 'somezip.zip'
b = BytesIO()
with zipfile.ZipFile(b, 'w') as zf:
for current_file in files:
try:
fh = default_storage.open(current_file.file.name, "r")
zf.writestr(fh.name, bytes(fh.read()))
except Exception as e:
print(e)
response = HttpResponse(zf, content_type="application/x-zip-compressed")
response['Content-Disposition'] = 'attachment; filename={}'.format(zfname)
return response
这会创建一个看起来像 zip 文件的文件,但它唯一的内容是“
我得到了许多不同的结果,主要是错误,例如在提供 FieldFile 时 zipfile 需要字符串或字节内容。在这一点上我完全卡住了。
问题是我需要通过添加
恢复到文件开头zf.seek(0)
就在 HttpResponse 中返回文件之前。