Django:使用 django-storage 从 S3 创建 zipfile

Posted

技术标签:

【中文标题】Django:使用 django-storage 从 S3 创建 zipfile【英文标题】:Django: Create zipfile from S3 using django-storage 【发布时间】:2020-12-13 09:54:02 【问题描述】:

我使用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

这会创建一个看起来像 zipfile 但它唯一的内容是 ''

我得到了许多不同的结果,主要是在提供 FieldFile 时出现 zipfile 需要字符串或字节内容等错误。在这一点上,我完全被卡住了。

【问题讨论】:

【参考方案1】:

问题是我需要通过添加恢复到文件的开头

zf.seek(0)

就在 HttpResponse 中返回文件之前。

【讨论】:

以上是关于Django:使用 django-storage 从 S3 创建 zipfile的主要内容,如果未能解决你的问题,请参考以下文章

一起使用 django-storages 和 django-compressor 时尝试压缩静态文件时出错

Django-storages + boto + S3 collectstatic 的最小凭据

Django-storage - 如何在上传前检查文件大小?

使用 s3 和 django-storages 并上传图片

如何使用 django-storages 将图像上传到亚马逊 S3?在管理员中上传有效,但在网站表单中无效

django-storages + sorl_thumbnail + S3 不能很好地协同工作(URL 不匹配)