所以我将解释这个问题:
步骤:
1)客户端(浏览器javascript)向服务器发送Ajax请求,命中下载控制器方法。
2)控制器的方法创建一个PDF资源(不保存在文件系统上),并将带有PDF二进制流的响应返回给客户端。
3)客户端接收PDF二进制流并将其下载到客户端的计算机上。这可能吗?
代码: 我已经尝试过的事情 -
客户端:
<script>
(function($) {
var button; // some random DOM button
button.on('click', function(e) {
e.preventDefault();
$.ajax({
url: "/download/:userId"
method: "POST",
dataType: "json"
success: function(response) {
var reader = new FileReader;
var file = new Blob([response.pdf_stream], 'application/pdf');
// create a generic download link
var a = $('<a/>', {
href: file,
download: response.filename
});
// trigger click event on that generic link.
a.get(0).click();
}
});
}
})(jQuery);
</script>
在服务器端:
class Controller
{
public function download($userId)
{
// fetching the user from the database
$user = User::find($userId);
// creating a pdf file using barry pdfdom package
// this will actually parse an HTML view and give us the PDF blob.
$pdf = PDF::loadView('pdf.view')->output();
// using Laravel helper function
return response()->json([
'pdf_stream' => utf8_encode($pdf),
'filename' => 'blahblah.pdf"
]);
// Or if you will in native PHP, just in case you don't use laravel.
echo json_encode([
'pdf_stream' => utf8_encode($pdf),
'filename' => 'blahblah.pdf"
]);
}
}
任何想法我在这里做错了什么?如何在不将其保存到系统的情况下下载该PDF文件(安全性和空间问题)。
任何帮助都将不胜感激。
伊甸
答案 0 :(得分:0)
如果您想在客户端下载pdf,只需在新窗口中打开此pdf即可。对这些事情使用GET请求,例如在RESTfull应用程序中(例如download / user /:id或某种类似的)。
答案 1 :(得分:0)
主要问题是控制器返回的响应。试试这个:
public function download($userId)
{
// fetching the user from the database
$user = User::find($userId);
// creating a pdf file using barry pdfdom package
// this will actually parse an HTML view and give us the PDF blob.
$pdf = PDF::loadView('pdf.view')->output();
return response($pdf, 200,
[
'Content-Type' => 'application/pdf',
'Content-Length' => strlen($pdf),
'Cache-Control' => 'private, max-age=0, must-revalidate',
'Pragma' => 'public'
]
);
关于调用执行download($userid)
方法的路线:
您不必使用Ajax。简单方法:
<a href="/path/to/download/1" target="_blank">Click view PDF</a>