我看过很多这样的问题的答案,但没有一个解决了我的问题……
我想在后端产生一个pdf,然后下载给用户。所以我有一个带有按钮的基本空白页面。对于该按钮,有一个jQuery函数:
$.post("{% url 'printReport' %}",
{
'params' : JSON.stringify({
'reportcode' : 'HelloWorld',
})
}, function(data, status) {
$("#testZone").text(data)
});在服务器端,我生成pdf并将其保存在本地服务器文件夹中。这一切都很完美。然后,在views文件中,我有以下内容:
def printRreport(request):
if request.method=="POST":
res = producePdf(request) #works fine! the PDF is birght an shiny, saved on the server
response = HttpResponse(res.data,content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="report.pdf"' #setting response headers
return response其中res.data实际上是open(pdf_path,'r').read()
这有70%的好处,因为浏览器实际上接收了请求响应中的pdf数据(我可以在开发控制台上看到它)。这是30%的错误,因为它没有给我一个下载对话框,也不允许我在客户端保存一个pdf文件。
这里出了什么问题?在我的例子中,我选择使用POST方法,我知道这是有争议的,但我不认为这是问题所在……
编辑:我找到了一个解决方案,可能不是最优的,但它是有效的。我在下面标出了我最终要遵循的答案。我保留了上面的代码,但我决定在第一个视图(它接收POST请求)上生成pdf文件,然后将用户重定向到另一个视图,在那里下载它。而且它起作用了!
不过,我仍然会按照Abdul的建议检查this。
谢谢!
发布于 2021-02-06 23:43:58
尝试使用FileResponse而不是HttpResponse
from django.http import FileResponse
def printRreport(request):
res = producePdf(request)
file_ptr = # something that would get you something like open(pdf_path,'rb')
return FileResponse(file_ptr)现在在你的javascript中,问题是你是以ajax的形式发出请求,而内容是javascript的,更简单的事情是让你的浏览器处理url (这是一个文件下载,无论如何不需要ajax):
var link = document.createElement("a");
link.download = "Report";
link.href = "{% url 'printReport' %}";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);注意:如果你不需要动态地运行它,可以考虑只使用一个带有url的锚。而不是javascript。
https://stackoverflow.com/questions/66078468
复制相似问题