JQuery Ajax调用PDF文件下载

时间:2011-09-28 03:57:08

标签: asp.net-mvc-3 jquery

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

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

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

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

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

3 个答案:

答案 0 :(得分:8)

您不应使用AJAX下载文件。这不起作用。据说你有两个选择:

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

  2. 或者如果您担心要将大量数据传递给将生成要下载的PDF的控制器操作,请使用带有<form>的{​​{1}}并在其中使用隐藏字段存储尽可能多的参数和数据:

    method="POST"

答案 1 :(得分:1)

您可以使用锚标记和php强制下载来执行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");
    }

我也在努力解决这个问题,上面的代码对我有用,我希望它有所帮助

答案 2 :(得分:0)

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

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

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