Javascript 名称中带有#的文件名无法下载
背景 我有一个在CentOS服务器上运行的PHP应用程序。前端使用ajax调用生成PHP脚本。脚本从服务器返回一个文件并将其下载到客户端 问题 如果文件名中有Javascript 名称中带有#的文件名无法下载,javascript,php,centos7,Javascript,Php,Centos7,背景 我有一个在CentOS服务器上运行的PHP应用程序。前端使用ajax调用生成PHP脚本。脚本从服务器返回一个文件并将其下载到客户端 问题 如果文件名中有#,则文件下载失败 示例 文件#Name.pdf=未正确下载 FileName.pdf=下载是否正确 这是用于检索文件的PHP if( isset($_GET['path'])) { $path = $_GET['path']; if(!file_exists($path)) { die('file not
#
,则文件下载失败
示例
文件#Name.pdf
=未正确下载
FileName.pdf
=下载是否正确
这是用于检索文件的PHP
if( isset($_GET['path'])) {
$path = $_GET['path'];
if(!file_exists($path)) {
die('file not found');
} else {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$path);
header('Content-Length: '.filesize($path));
readfile($path);
ob_clean();
flush();
exit;
}
}
问题
为什么文件名中包含
#
时无法下载?啊,文件名是否来自GET请求?如果是这样的话#可能会被重写为%23。试一试
$path = urldecode($_GET['path']);
如果在URL中使用
文件%23Name.pdf
,它是否有效?在失败的情况下会发生什么?您的ajax调用是否得到响应?您可以使用浏览器探查器查看响应对象的标题或主体是什么吗?没有问题。一般来说,在php中,您可能会对客户端提供的任何文本值产生怀疑。我所说的可疑是指从安全/恶意用户的角度来看,以及从“这真的是我所认为的”的角度来看。