【发布时间】:2020-01-08 20:43:55
【问题描述】:
我有一个laravel-应用程序,我想从值生成 PDF,用户已在某些输入字段中输入。因此,当用户输入数据时,他单击一个生成 PDF 的按钮,然后立即自动下载。 所有这些都应该发生在同一条路线/视图上。 PDF 不应存储在某处。
所以现在,当我单击按钮时,输入的数据会通过,例如存储在数据库中,似乎创建了一个 PDF,但我看不到或找不到它,而且我的浏览器没有通知我有 PDF 可供下载。
在开始之前,我安装了laravel-dompdf-plugin,并按照说明进行操作。
所以我的路线是这样的
Route::view('formpage', 'app.statement')->name('statement'); // The blade view with the Form
Route::post('statement', 'MyController@generatePDF')->name('generatePDF'); // this is where I post the form
这是我的控制器
use PDF;
class MyController extends Controller {
public function generatePDF(Request $request){
$statement = Statement::create([
'name' => $validated['name'],
'email' => $validated['email'],
'phone' => $validated['phone'],
'declaration_date' => $validated['declaration_date'],
]);
$pdf = PDF::loadView('pdf.statement', $statement);
return $pdf->download('File__'.$statement->name.'.pdf');
}
}
我通过使用axios 来发布带有javascript 的表单,只需这样做:
$('#submitBtn').click(function(e) {
const formData = new FormData();
formData.append(
"name",
$("#statement")
.find('input[name="name"]')
.val()
);
...etc with all other fields
axios.post($("#statement form").attr("action"), formData)
.then(response => {
$('#submitBtn')
.attr("disabled", "disabled")
.addClass("disabled")
.html('<i class="fas fa-fw fa-check"></i> Success'); */
$("#statement form")[0].reset();
})
.catch(error => {
console.log("ERR: ", error); // DEBUG
$("#statement .text-danger").show();
$('#sworn-statement button[type="submit"]')
.removeAttr("disabled")
.removeClass("disabled")
.html("Send");
});
}
我做错了什么?
更新
我尝试过这样做:
const FileDownload = require("js-file-download");
axios.post($("#statement form").attr("action"), formData)
.then(response => {
FileDownload(response.data,"File.pdf");
}).catch(error => {
console.log('error:', error);
});
这给了我一个空白页。
【问题讨论】:
-
您正在使用 javascript 将请求发布到
statement路由?如果是这样,您需要发布对这个问题至关重要的 javascript 代码。如果您将浏览器导航到页面上,它就会起作用,因为他将内容类型的 pdf 作为响应并知道如何处理它。如果你用 js 异步发布你的东西,浏览器不知道发生了什么,因为他只是得到一个带有 pdf 的响应对象,如果你不在那里处理它,它将被忽略。 -
@thmspl 我已经更新了我的问题 - 添加了 js 代码
-
由于您是通过 javascript 创建请求,因此结果也来自 javascript。因此下载可能不会被触发,因为它作为 AJAX 响应返回。您可能需要将传入的数据转换为文件并通过 JS 触发下载,这是一个示例如何 blog.jayway.com/2017/07/13/open-pdf-downloaded-api-javascript 。响应可能不是 blob 格式,所以也要小心。