PHP强制下载文件名,带空格

PHP强制下载文件名,带空格,php,force-download,Php,Force Download,好的,我似乎在让我的脚本下载具有正确文件名的文件时遇到了问题 如果我去掉空格和破折号,看起来像这样 if($type == 'mc'){ $file_name = $_POST['Ids']; $file_name = str_replace('-', '', $file_name); $file_name = str_replace(' ', '&', $file_name); $url = base64_decode($stream);

好的,我似乎在让我的脚本下载具有正确文件名的文件时遇到了问题

如果我去掉空格和破折号,看起来像这样

if($type == 'mc'){
    $file_name = $_POST['Ids'];
    $file_name = str_replace('-', '', $file_name);
    $file_name = str_replace(' ', '&', $file_name);
    $url = base64_decode($stream);
    $file_url = "scd.php?stream=".$url."&name=".$file_name."";
    $url = array('url' => $file_url);
    echo json_encode($url);
}
这里是
scd.php

<?php
$file = $_GET['stream'];
$name = $_GET['name'];
header("Content-type: application/x-file-to-save");
header("Content-Disposition: attachment; filename=".$name.".mp3");
readfile($file);
exit();
?>

它将强制下载,但只保存发送名称中的第一个单词。因此,在此处假设名称为
Your Song
它希望将其保存为
Your.mp3
,但如果我从
$file\u name
变量中删除
str\u replace
,则它将尝试将文件保存为
Your
,没有扩展名,但仍然只有第一个单词

我需要它在这里传递整个
$file\u name
变量ex.
您的歌曲.mp3
,并将其保存为mp3文件


我不太确定我做错了什么

将文件名用引号括起来,比如

header("Content-Disposition: attachment; filename=\"${name}.mp3\"");
(不记得在php中如何在字符串中转义)


我相信这实际上是HTTP规范所要求的。

您试图在文件名中使用HTML实体(
&;
)。不要这样做。另外,不要在文件名中使用空格。最好将
'
替换为

$file_name = str_replace(' ', '_', $file_name);

这样,您的文件名就可以安全地通过url传递,无需任何特殊编码或转义。

就像一个符咒,我会尽快接受答案