JQuery Ajax 调用 PDF 文件下载

Posted

技术标签:

【中文标题】JQuery Ajax 调用 PDF 文件下载【英文标题】:JQuery Ajax call for PDF file download 【发布时间】:2011-11-26 13:07:20 【问题描述】:

我的问题类似于Download and open pdf file using Ajax

但不完全相同,我想要一个 JQuery ajax 的原因是我的文件是根据从同一页面获取的数据动态生成的。

所以基本上我有一个需要发送到服务器的 Json 对象,它会动态生成一个文件并将其发送回浏览器。

我不想在我的 Json 对象 stringyfied 的锚点上使用查询字符串, 因为我认为这将是一个潜在的威胁,因为查询字符串有字符限制(我在这里吗?)。

如果我的工作流程是正确的,或者我可以使用不同的流程实现相同的事情,请告诉我。

【问题讨论】:

【参考方案1】:

您不应该使用 AJAX 来下载文件。这行不通。话虽如此,您还有两个选择:

    操作链接和查询字符串参数,或者如果必须在某些特定的 javascript 事件中触发下载,您还可以将 window.location.href 设置为应该生成 PDF 文件并将查询字符串参数传递给它的操作.

    或者,如果您担心有大量数据要传递给将生成 PDF 下载的控制器操作,请使用 <form>method="POST",并在内部使用隐藏字段来存储尽可能多的参数和数据随你喜欢:

    @using (html.BeginForm("download", "home"))
    
        ... hidden fields containing values that need to be sent to the server
        <input type="submit" value="Download PDF" />
    
    

【讨论】:

Darin:您如何看待使用 AJAX GET 请求在服务器上生成文件?这允许我在失败回调中捕获文件生成期间服务器上发生的任何错误并将其显示给用户。如果成功,我会在 ajax 成功回调中传递文件名并执行window.location = server\folder\filename。我在这里使用 ASP.NET Web API。 OP 专门要求使用 ajax。这是对带宽的浪费。 @OmarPadilla,您无法使用 AJAX 将文件下载到客户端。但即使有可能,您也会浪费与使用直接链接下载文件完全相同的带宽量。这样做的简单原因是,在这两种情况下,您都在返回相同文件的服务器上调用相同的端点。并且不要误以为如果您不使用 AJAX,当前页面会重新加载。除了将流式传输文件的控制器操作之外,没有其他请求。【参考方案2】:

您可以使用锚标记和 php force download 来执行 pdf 下载,而不是在您的页面中再进行一次 ajax 调用

HTML
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a>

PHP
<?php
$fullPath = $_GET['fileSource'];
if($fullPath) 
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);
    switch ($ext) 
        case "pdf":
        header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
        header("Content-type: application/pdf"); // add here more headers for diff. extensions
        break;
        default;
        header("Content-type: application/octet-stream");
        header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    
    if($fsize) //checking if file size exist
      header("Content-length: $fsize");
    
    readfile($fullPath);
    exit;

?>

我正在检查文件大小,因为如果您从 CDN cloudfront 加载 pdf,您将无法获得强制文件以 0kb 下载的文档大小,为避免这种情况,我正在检查此条件

  if($fsize) //checking if file size exist
      header("Content-length: $fsize");
    

我也在为这个问题苦苦挣扎,上面的代码对我有用,我希望它可以帮助

【讨论】:

给定 ASP.NET 标签的好答案,虽然不是很相关。【参考方案3】:

我有一个非常确定的答案。使用 ajax 请求到服务器时,您无法下载 PDF 文件。因此,您应该使用 html actionlink。例如

@Html.ActionLink("Convert Data into PDF", "PDFView", null, new  @class= "btn btn-info" );

以上代码将生成一个链接按钮,您可以访问控制器的Action Method。您也可以使用任何技术从控制器返回 PDF 文件,例如您可以使用 FileResult 类返回 PDF 文件。

【讨论】:

以上是关于JQuery Ajax 调用 PDF 文件下载的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ASP.NET MVC Rest API 调用和 jQuery Ajax 下载文件

JQuery $.ajax“异步:假”错误?

从通过 jQuery AJAX 调用的控制器返回 PDF

如何调用 MVC 操作来下载 PDF 文件?

查看从AJAX调用返回的PDF

使用 jQuery Ajax 调用下载和保存文件