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

PHP Force Download File Name with Spaces

好的,我似乎无法让我的脚本下载具有正确文件名的文件。

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

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 Here 它想将其保存为 Your.mp3 但是如果我从 $file_name 变量中删除 str_replace 然后它会尝试将文件保存为 Your 没有扩展名,但仍然只有第一个词。

我需要它来传递整个 $file_name 变量 ex。 Your Song Here.mp3 并仍将其保存为 MP3 文件。

我不太确定我做错了什么

将文件名用引号引起来,类似于

header("Content-Disposition: attachment; filename=\"${name}.mp3\"");

(不记得如何在 php 的字符串中转义 "s)。

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

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

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

那么您的文件名将可以安全地通过 url 传递给您,而无需任何特殊编码或转义。