首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery/Django检索文件

问jQuery/Django检索文件
EN

Stack Overflow用户
提问于 2021-02-06 23:20:48
回答 1查看 33关注 0票数 0

我看过很多这样的问题的答案,但没有一个解决了我的问题……

我想在后端产生一个pdf,然后下载给用户。所以我有一个带有按钮的基本空白页面。对于该按钮,有一个jQuery函数:

代码语言:javascript
复制
  $.post("{% url 'printReport' %}", 
  {
    'params' : JSON.stringify({
      'reportcode' : 'HelloWorld',
    })
  }, function(data, status) {
    $("#testZone").text(data)
  });

在服务器端,我生成pdf并将其保存在本地服务器文件夹中。这一切都很完美。然后,在views文件中,我有以下内容:

代码语言:javascript
复制
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。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-06 23:43:58

尝试使用FileResponse而不是HttpResponse

代码语言:javascript
复制
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):

代码语言:javascript
复制
var link = document.createElement("a");
link.download = "Report";
link.href = "{% url 'printReport' %}";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

注意:如果你不需要动态地运行它,可以考虑只使用一个带有url的锚。而不是javascript。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66078468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档