我运行以下代码在后台下载文件,而不是仅仅重定向到浏览器中的文件,但是我无法点击页面上的任何其他内容,直到整个文件被下载。我可以在代码中修改一下来修复它吗?
当点击一个链接时,它被加载到一个单独的php文件中,因此用户不会看到从哪里获取文件($ filepath),它也受到会话的保护:
header("Cache-control: private");
header("Content-Type: application/octet-stream");
if ($download) {
header("Content-Disposition: attachment; filename=\"" . $title . "\"");
header('Content-Transfer-Encoding: binary');
} else {
header("Content-Disposition: inline; filename=\"" . $title . "\"");
}
// Disable caching
header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
header('Pragma: no-cache'); // HTTP 1.0.
header('Expires: 0'); // Proxies.
readfile($filepath);
编辑//我仍然无法解决这个问题。现在我尝试使用这个AJAX代码,但它仍然锁定整个页面,直到文件完全下载,它只在后台加载,而不是加载到硬盘。
$('.download').on('click', function(e) {
e.preventDefault();
var self = $(this);
$.ajax({ type: 'POST',
url: self.attr('href'),
async: true,
success : function(response)
{
}
})
});
答案 0 :(得分:2)
免责声明:以下所有内容均适用于默认的基于文件的会话。对于其他处理程序,它可能不会成立。
会话阻止:只要一个页面打开会话,就不会提供相同会话ID的其他页面。
解决方案是在完成后立即关闭会话。
所以放
session_write_close();
在您开始提供文件之前。
它会关闭提供该文件的页面的会话,之后可以提供其他页面,即使该文件尚未完全下载。
参考文献: