PHP-从外部服务器下载文件,文件名有引号“'";:';filename.zip;


PHP - Download file from external server, filename has quotes " ' " : 'filename.zip'

我制作了一个脚本,根据请求,服务器将返回一个特定的文件从外部源下载,我使用外部源,因为我在另一台服务器上有无限带宽:

$ch = curl_init();
$url="http://www.example.com/downloads/$fileName";
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true); // make it a HEAD request
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);
$mimeType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mimeType");
header("Content-length: $size");
header("Content-Transfer-Encoding: binary"); 
header("Content-Disposition:attachment;filename='$fileName'");
readfile($url);

$filename来自前端的请求。这是一个表单中的简单帖子。

一切都很好,但有些用户(不是所有用户)报告说,他们无法打开文件,因为文件名有引号:'filename.zip',而不是filename.zip

我碰壁了,我甚至不知道从哪里开始寻找,显然这发生在一些mac用户身上。有什么想法吗?

HTTP标准会让您在Content-Disposition标头中的filename参数周围加上双引号。在你的代码中可能是这样的:

header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Type: ' . $mimeType);
header('Content-Type:application/octet-stream');
header('Content-length: ' . $size);
header('Content-Transfer-Encoding: binary'); 
header('Content-Disposition:attachment;filename="' . $fileName . '"');
readfile($url);

请注意,我已经更改了您的所有PHP字符串定义,使用单引号来一致地显示所有字符串定义。