我正在使用ajax提交表单,提交表单后,我需要下载服务器端使用php库mpdf生成的pdf文件。我不想将pdf文件保存在服务器中,因为在用户下载后不再需要该文件。我在Google上搜索过,有人建议使用Blob对象。我还返回了一个json响应以显示给用户。有人可以解释一下是否可行以及如何实现吗?非常感谢
这是我的JavaScript代码:
$.ajax({
type: form.method,
data: $(form).serialize(),
dataType: 'JSON',
beforeSend: function() {
// Show loader
$(".loader").show();
},
success: function(response) {
// Hide loader
$(".loader").hide();
if (response.error_code == '200') {
// Add class alert danger to the message
$('.alert', $('.horizontal-form')).addClass('alert-success').show();
// Show error message
$('#error_message').html(response.error_message);
// Remove default validation error message from template
$('#error_message').get(0).nextSibling.remove();
// Remove class alert danger if was left by previous validation
$('.alert', $('.horizontal-form')).removeClass('alert-danger');
// reset form fields
form.reset();
// Scroll back to show success message
scrollTo(success, -200);
}
}
});
这是我的php代码
if(isset($_POST['userLetter'])){
header("Content-Type", "application/pdf");
// Render the view using twig and pass params to it
$html=$twig->render('/km-letters/km-letter-new-user.twig', array(
// Render user details on twig topbar
'prova' => 'pippo'
));
$mpdf->WriteHTML($html);
return $mpdf->Output('foobar-' . time() . '.pdf','D');
}
从响应中我也得到以下标题,并且可以看到pdf文件:
缓存控制
公共,必须重新验证,最大年龄= 0
连接
活着
内容描述
文件传输
内容配置
附件; filename =“ doc.pdf”
内容传输编码
二元
内容类型
应用/ pdf
日期
太阳,2019年3月10日11:11:35 GMT
过期
1997年7月26日,星期六,格林尼治标准时间
保持生命
超时= 5,最大= 99
最后修改
太阳,2019年3月10日11:11:35 GMT
语气
上市
服务器
阿帕奇
传输编码
大块
X生成器
mPDF 7.1.9
X-Powered-By
PHP / 7.3.0
但是我也得到以下很长的字符串响应:
XHRPOSThttp://router.kondomatica.me/km-users/createUser# [HTTP / 1.1 200 OK 332ms] HeaderCookieParametriRispostaTempiAnalisi dello stackPayload rispostax1JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKLKlJQQ9494>
答案 0 :(得分:0)
根据问题的评论,这是一个未经测试的解决方案,应该可以使用。
由于安全原因,javascript无法保存文件,因此代码首先从响应中创建一个Blob
对象,然后是一个指向Blob
的对象URL的锚点。然后将锚添加到DOM,然后“单击”,然后从DOM中删除。
$.ajax({
type: form.method,
data: $(form).serialize(),
cache: false,
beforeSend: function() {
// Show loader
$(".loader").show();
},
success: function(response, responseCode, xhr) {
// Hide loader
$(".loader").hide();
if (responseCode == "200") {
var disposition = xhr.getResponseHeader('content-disposition');
var matches = /"([^"]*)"/.exec(disposition);
var filename = (matches != null && matches[1] ? matches[1] : 'doc.pdf');
var blob = new Blob(response, {
type: 'application/pdf'
});
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// Add class alert danger to the message
$(".alert", $(".horizontal-form"))
.addClass("alert-success")
.show();
// Show error message
$("#error_message").html(response.error_message);
// Remove default validation error message from template
$("#error_message")
.get(0)
.nextSibling.remove();
// Remove class alert danger if was left by previous validation
$(".alert", $(".horizontal-form")).removeClass("alert-danger");
// reset form fields
form.reset();
// Scroll back to show success message
scrollTo(success, -200);
}
}
});