我正在创建一个应用程序,用户可以查看表格中显示的许多PDF。每行还具有复选框,允许用户检查或不检查我稍后将描述的下一个动作。
这些复选框位于表单标记内,然后是一个提交按钮,该按钮通过POST方法通过AJAX REQUEST将所有文件ID发送到PHP文件中。
AJAX请求如下:
$.ajax({
url: link,
type: 'POST',
data: $(this).serialize(),
success: function(result) {
if (result == 'ok') {
if (redirect) {
window.location.replace(redirect);
} else {
window.location.reload();
}
} else {
if (callback) {
$('#' + callback).html('<div>' + result + '</div>');
} else {
alert(result);
}
}
}
});
没什么特别的,所有帖子数据都被获取并发送到特定的PHP文件。
进一步移动,在PHP文件端-有一种算法,该算法通过接收的整个发布方法ID来检查用户是否有权访问所有文件。因此,存在一个与SQL查询结合的简单循环。
当LOOP确认他具有有效的访问权限时-我正在创建一个大文件,其中包括他通过先前的复选框选择的所有文件。在这种情况下,我使用的是mPDF,合并文件对我来说不是问题。
然后在服务器上创建合并文件,并具有特定名称。
现在-就像我之前说的那样,此文件应该是非常私有的,因此在用户下载它之后,我希望脚本也删除该文件。但是我无法处理下载的部分。
我尝试从PHP文件端发送标头,但它的结束就像将奇怪的字符输出到回调div元素中一样,而不是显示下载对话框。
我发送标头的代码如下
$file = __PATH_TO_FILE__ . 'MaJjYzA4OGE4N2Q0MjUwNmJkZDQ0ZmZm.pdf'; //file which in fact exists
header('Content-type: application/download'); //or event tried with application/pdf => no difference
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="'. $file .'"');
return readfile($file);
摘要,而不是提示对话框+下载-奇怪的字符覆盖了回调区域。
如果你们知道在这种情况下发生了什么以及我应该做什么,我将很高兴获得帮助。另外,如果您建议我在用户下载文件后删除文件甚至取消提示对话框以使文件不再保留在服务器上,该如何处理,我将非常感谢。
答案 0 :(得分:2)
您需要从ajax返回指向文件的链接
$file = __PATH_TO_FILE__ . 'MaJjYzA4OGE4N2Q0MjUwNmJkZDQ0ZmZm.pdf'; //file which in fact exists
echo $file;
成功获得ajax后,您只需打开该文件的新窗口即可;
success: function(file) {
window.open(file);
}
另一种解决方案是使用隐藏的下载链接
success: function(file) {
$('body').append('<a href="'+file+'" class="hiddenLink" download style="display:none;"></a>');
$('.hiddenLink').trigger('click');//or $('.hiddenLink')[0].click();
}
答案 1 :(得分:0)
对我有用。
success: function(response) {
i++;
$('#buttonid').append('<a href="'+response+'" class="hiddenlink" download style="display:none"></a>');
if(i == 1){
$('.hiddenlink')[0].click();
} else {
i=0;
$('.hiddenlink').remove();
}
}