【问题标题】:Saving a ZipFile to FileField in Django在 Django 中将 ZipFile 保存到 FileField
【发布时间】:2021-04-14 18:34:20
【问题描述】:

我在 Django 中有以下模型:

class AksOrder(models.Model):
    zip_file = models.FileField(upload_to='aks_zips/%M/%S/', blank=True)

在我看来,我有以下基本功能:

def gen_zip(pk, name, vars):
    zipObj = ZipFile(os.path.join('/tmp/', str(name) + '_' + str(pk) + '.zip'), 'w')
    zipObj.write(pdf_files[0].path, '/filea.pdf')
    zipObj.write(pdf_files[1].path, '/fileb.pdf')

def aksorder_complete(request, pk):
    ao = get_object_or_404(AksOrder, id=pk)
    zipObj = generate_shop_zip(ao.c.pk, ao.dl, ao.vars)
    ao.zip_file.save('file.zip', zipObj)

我不仅尝试了这个版本,而且这个版本对我来说似乎是最合理和最合乎逻辑的版本。我得到一个There is no item named 65536 in the archive。当我在第一个函数中稍微修改它并在 zip 写入结束时关闭文件时,我收到一条 ValueError: Attempt to use ZIP archive that was already closed 消息。两次,zip 文件都在 /tmp/ 中正确生成,我无法解决它。这只是本地的,我需要稍后为 S3 做......

【问题讨论】:

  • 您想在 Zipfile 中插入 images 吗?
  • 不,pdf。如gen_zip 函数的第 3 行和第 4 行所述。有用。我基本上要问的是,如何在 django 中将 zipflie 保存到 FileField。我不能Filefield = Zipfile

标签: django zip filefield


【解决方案1】:

我终于实现了:我在最后的第一个函数中添加了zipObj.close(),并像这样修改了第二个函数:

file = open('path/to/file.zip', 'rb')
ao.zip_file.save('name.zip', file)

显然,文件打开中的rb 模式是决定性的。

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2010-10-25
    • 2021-04-25
    相关资源
    最近更新 更多