AJAX + PHP + 下载mPDF生成的文件

3
我正在创建一个应用程序,用户可以通过访问表格来查看许多PDF文件。每一行还有一个复选框,允许用户选择或不选择下一步操作(稍后会描述)。
这些复选框位于表单标签内部,在其之后有一个提交按钮,通过POST方法通过AJAX请求将所有文件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查询。

当循环验证他有有效的访问权限时 - 我会创建一个由前面的复选框选择的所有文件组成的大文件。在这种情况下,我使用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);

简而言之,在特定情况下,不要使用提示对话框+下载 - 奇怪的字符覆盖回调区域。

如果您知道发生了什么,并且在这种情况下应该做什么,我会很高兴得到帮助。此外,如果您建议我在用户下载文件后删除文件或甚至取消提示对话框,以便文件不再停留在服务器上,我将更加感激。


所以你正在将PDF文件附加到HTML页面中,你期望发生什么? - madalinivascu
目前为止 - 期望收到任何帮助和建议,告诉我应该改变什么。 - Marcin
从readfile($file)中删除return并进行检查。 - Vitthal
@suraj - 我做完了之后,什么都没有发生。 - Marcin
请查看此链接,它可能对您有所帮助: https://dev59.com/aWjWa4cB1Zd3GeqPniBX - Vitthal
@suraj,那里没有关于Ajax下载的内容 :) - Marcin
2个回答

3
您需要从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();
    }

有一个变化,但是网络浏览器正在阻止弹出窗口。如何实现下载对话框窗口呢? - Marcin
什么是下载对话框窗口? - madalinivascu
下载提示窗口,以便用户可以将文件保存到他的计算机上。 - Marcin
完美运作!因此,由js添加的元素应该通过数组索引进行定位。 - Marcin
1
很高兴能够帮助。 - madalinivascu
显示剩余6条评论

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(); } }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接