首页 > 解决方案 > 在 Django Python 中将文件作为下载返回

问题描述

我使用 Django 创建了一个站点,并创建了一个从数据库数据返回自动生成的 pdf 的函数。

为了制作 PDF,我使用 pyFPDF。

pdfreport = FPDF()
#Code for the PDF here

pdfreport.output(name='mypdf.pdf')

使用此代码一切正常,PDF 已正确生成。但是为了将文件作为 HTTP 响应返回,我保存文件 dest='S'并做出响应。

pdf = pdfreport.output(dest='S')
response = = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="mypdf.pdf"'
return(response)

使用它,响应是正确的,我得到了要保存的文件,浏览器将文件加载为 pdf,但 pdf 是空白的。我不知道为什么会这样。

我尝试保存文件,打开文件open()并附加其内容,但我仍然得到相同的结果,一个空白的 pdf。

pdfreport.output(name=pdfname)
pdf = open(pdfname, 'r')
response = HttpResponse(pdf, content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="mypdf.pdf"'
return(response)

任何可以帮助我的人吗?

标签: pythondjangofilepdf

解决方案


比较保存 FPDF 的文件和 HTTP 响应发送的文件,我意识到有一个编码错误,所以我在官方文档中找到了这个。

注意:在 Python 2 中,字符串是原始数据,但在 Python 3 中,字符串现在默认是 unicode。如果您使用的是 Python 3.x,则必须使用 Python 3.xpdf.output(dest='S').encode('latin-1')才能获得输出,如果不这样做,生成的 PDF 将无效,并且取决于查看器,要么根本不打开,要么显示为一些空白页。

我尝试了它的编码latin-1,它终于可以工作了。


推荐阅读