PHP Force使用空格下载文件名

时间:2015-11-29 19:45:35

标签: 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);
    $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,但如果我从str_replace变量中删除$file_name,则会尝试将文件另存为{{ 1}}没有扩展但仍然只有第一个单词。

我需要它传递整个Your变量ex。 $file_name并将其另存为MP3文件。

我不太确定我做错了什么

2 个答案:

答案 0 :(得分:3)

用引号括起文件名,比如

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

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

我认为这实际上是HTTP规范所要求的。

答案 1 :(得分:2)

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

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

然后,您的文件名可以安全传递到url,无需任何特殊编码或转义。