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 实体 (&
)。不要那样做。另外,不要在文件名中使用空格。您最好将 ' '
替换为 _
:
$file_name = str_replace(' ', '_', $file_name);
那么您的文件名将可以安全地通过 url 传递给您,而无需任何特殊编码或转义。
好的,我似乎无法让我的脚本下载具有正确文件名的文件。
如果我去掉空格和破折号,看起来像这样
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 实体 (&
)。不要那样做。另外,不要在文件名中使用空格。您最好将 ' '
替换为 _
:
$file_name = str_replace(' ', '_', $file_name);
那么您的文件名将可以安全地通过 url 传递给您,而无需任何特殊编码或转义。