我已经编写了一个django视图,它可以加载许多PDF文件并将它们组合到一个.zipfile中。
我不想将对象保存在服务器上,所以我使用StringIO()
这是通过以下代码完成的:
zip_buffer = StringIO.StringIO()
summary_filename = 'summary' + str(user) + '.pdf'
with zipfile.ZipFile(zip_buffer, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
for file in attachements:
zf.write(str(settings.MEDIA_ROOT) + '/' + str(file[0].file),
file[1] + '.' + str(file[0].file).split('.')[-1])
zf.writestr(summary_filename, pdf)当我调试代码时,我让它通过以下代码在浏览器中以下载的形式返回对象
response = HttpResponse(zip_buffer.getvalue(), 'application/x-zip-compressed')
return response当我单击按钮时,浏览器会下载一个包含所有信息的.zip文件。
当我也想通过电子邮件发送文件时,问题就开始了。我正在使用Django post-office
并尝试使用以下命令发送电子邮件:
attachment_file = zip_buffer.getvalue()
send_email([requester.email], email_template
context, attachments={'summary.pdf': attachment_file})附件文件与我提供给浏览器的文件完全相同,但这会导致以下异常:
file() argument 1 must be encoded string without NULL bytes, not str然后我尝试了一些不同的东西:
send_email([requester.email], 'userprofile_summary', requester.profile.tenant,
context, attachments={
'summary.zip': ContentFile(attachment_file)})现在,这在某种意义上是有效的,即发送带有附件的电子邮件,但我收到的文件是不可打开的。它就像它的损坏,无论是OSX,Windows和Linux电脑都无法打开文件。
我现在不知道该怎么做/问题出在哪里。该文件在浏览器中运行良好,但当我尝试通过电子邮件发送它时,它却崩溃了。当我将其封装到'ContentFile()‘类中时,它返回一个无法打开的文件。
有人知道我做错了什么吗?
发布于 2018-02-13 23:43:39
我解决了它,这是我的代码中的一个错误。对于有类似问题的未来读者:
我忘了在zf.writestr(summary_filename, pdf)后面添加一个zf.close(),虽然浏览器能够处理这个错误,但Django更小心--导致了我的问题。添加close()命令解决了这个问题。
https://stackoverflow.com/questions/48768366
复制相似问题