我的问题类似于Download and open pdf file using Ajax
但不完全相同,我想要一个JQuery ajax的原因是我的文件是从将从同一页面获取的数据动态生成的。
所以基本上我有一个需要发送到服务器的Json对象,它会动态生成一个文件并将其发送回浏览器。
我不想在我的Json对象stringyfied的锚点上使用查询字符串, 因为我认为这将是一个潜在的威胁,因为查询字符串有字符限制(我在这里吗?)。
请告诉我如果我的工作流程正确,或者我可以使用不同的流程实现同样的事情。
答案 0 :(得分:8)
您不应使用AJAX下载文件。这不起作用。据说你有两个选择:
操作链接和查询字符串参数,或者如果必须在某个特定的javascript事件中进行下载,您还可以将window.location.href
设置为应该生成PDF文件的操作并传递查询字符串参数它。
或者如果您担心要将大量数据传递给将生成要下载的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文件。