【问题标题】:how to open a PDF file while returning the file in AJAX request success response如何在 AJAX 请求成功响应中返回文件时打开 PDF 文件
【发布时间】:2013-12-26 08:10:14
【问题描述】:

我通过 AJAX 获得 2 个日期,开始日期和结束日期。我处理这两个日期的数据,生成报告,然后返回一个 HttpResponse。 PDF 报告现在保存在我的主项目目录中。现在我在 AJAX 中得到了回复。那么,现在我应该如何处理成功函数中的响应,从服务器发回并打开一个 PDF 文件。

谢谢。

jQuery

$(function() {
  $("#report_submit").click(function(){
      $.ajax({
      type : "POST",
      url: "/reports/",
      data : { 'start_date' : $("#startDate").val() , 'end_date' : $("#endDate").val() },
      success : function(result){

      },

      error : function(result){
      }
    });

  });
});

Django 查看代码

def generate_report(request):
    ctx = {}

    if request.is_ajax():
        if request.POST.has_key('start_date'):
            start_date = datetime.strptime(request.POST[ 'start_date'] , '%m/%d/%Y')
            end_date = datetime.strptime(request.POST[ 'end_date'] , '%m/%d/%Y')

            ......
            # PDF GENERATED in MAIN PROJECT DIRECTORY

            with open(os.path.join(os.path.dirname(__file__),'../../../../gui','Report.pdf')) as pdf:
                response = HttpResponse(pdf.read(), content_type='application/pdf')
                response['Content-Disposition'] = 'inline;filename=Report.pdf'

                return response  # so, now when I send a response back, how should I process it in AJAX success function?
            pdf.closed


    return render(request, 'generate_report/reports.html', ctx)

【问题讨论】:

    标签: python django jquery pdf


    【解决方案1】:

    这个问题已经在下面的问题中讨论过...您可能需要去jquery插件下载文件,请不要忘记在响应中设置cookie。

    PDF file download through XHR Request

    您可能需要为文件下载添加一个 javascript 文件,并使用以下代码生成对服务器的请求。

    $.fileDownload(urlll,{  
            successCallback: function (url)     
            {           
                //success code here
            },      
            failCallback: function (html, url) 
            {    
                //error code here
            } 
        });
    

    在服务器端,在响应中添加标头等时,在响应对象中执行以下操作。即

    aResponse.addCookie(cookie);
    

    我希望你能解决这个问题,也可以帮助其他人..“悬空指针”

    【讨论】:

    • 让我试一试。
    • 您不必下载该文件。只需将浏览器重定向到它。请记住,现在您已经生成了文件,它位于文件系统中的某个位置,并且可以通过 URL 进行检索。只需在响应中传回 URL 并使用 JS 重定向到它。您甚至可以设置一个 cookie 来限制对它的访问。
    • 我应该在AJAX的成功函数下添加你上面的代码$.fileDownload吗??
    • 没有。 $.fileDownload 本身是对服务器的文件下载的 ajax 请求......它创建一个 iFrame,然后下载文件,然后删除 iFrame......这就是它的工作原理。由于 XHR 请求无法从服务器下载文件.. 我浏览了很多论坛...
    【解决方案2】:

    最简单的解决方案是在“成功”回调中调用window.open(pdf_url),其中 pdf_url 是指向您生成的 pdf 报告的链接(您需要将其传递给响应)。

    【讨论】:

      【解决方案3】:

      不要尝试在 Ajax 响应中发送它。相反,让您的视图为 PDF 生成一个唯一的 URL,然后让 JS 将浏览器重定向到该 URL:

      查看:

      return HttpResponse(json.dumps({'url': my_url})
      

      JS:

      $.ajax({
        type : "POST",
        dataType: "json",
        url: "/reports/",
        data : { 'start_date' : $("#startDate").val() , 'end_date' : $("#endDate").val() },
        success : function(result){
           var url = result['url'];
           window.location = url;
        },
      

      【讨论】:

      • 生成一个url是什么意思?我将如何为每个文件生成一个新的 url?我有保存该文件的路径。这是否符合 url 的目的?
      • 我的意思是,您需要一个 URL 来提供 PDF。您需要某种唯一标识符,以便服务视图可以识别它。请记住,您的网站可能会同时为多人提供服务,因此您不能只在“主目录”中生成一个 PDF:它很容易被另一个请求覆盖。
      • 我明白了你的意思,但我的问题仍然是如何在 urls.py 文件中为这个 PDF 文件创建一个 url?您是在谈论提供静态文件吗?
      • 是的。您只需要一个从 URL 获取 ID、打开相关 PDF 的视图,然后执行您上面的原始代码(在 with 内)所做的事情。
      • 我的问题是如何为这个 pdf 分配 url?
      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多