2

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

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

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变量中删除它然后它将尝试将文件保存为Your没有扩展名但仍然只有第一个单词。

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

我不太确定我做错了什么

4

2 回答 2

8

将文件名括在引号中,例如

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

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

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

于 2015-11-29T19:51:54.030 回答
1

You're trying to use an HTML entity (&amp;) in your file name. Don't do that. Also, don't use spaces in file names. You're better off replacing ' ' with _:

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

Then your file name will be safe to pass to via url without any special encoding or escaping needed.

于 2015-11-29T19:56:31.133 回答