PHP:标头强制下载损坏(MP3文件)

时间:2015-08-27 00:55:11

标签: php downloading corrupt

我正在创建一个简单的网站,让您下载歌曲。但是,我的脚本将下载mp3文件,但是当我尝试打开它时,它在某种程度上被破坏了。 不仅如此,文件大小也明显减少了。

代码:

<?php

error_reporting(0);
echo "<style>
        body {
            font-family: Verdana;
            background-color:#D9DDDB;
            color:black;
        }
    </style>
";

echo "<br><br><br><center><h1>Your Download is Starting...</h1></center><br><br><br><center><p>Copyright&copy; 2015 <font color='blue'>MusicProductionZ</font></p></center>";

if(isset($_GET['access_token'])) {
        if($_GET['access_token'] == '3486784401') {

            if(isset($_GET['file_name'])) {


                // Add More Here
                switch($_GET['file_name']) {
                    case 'fettywap_trapqueen':
                        $filename = "/files/fettywap_trapqueen/Fetty Wap - Trap Queen.mp3";
                        send_download($filename);
                        exit;
                        break;
                    default:
                        break;
                        exit;
                }

            }

        }
    }

    function send_download($file)
    {
        $basename = basename($file);
        $length   = sprintf("%u", filesize($file));

        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $basename . '"');
        header('Content-Transfer-Encoding: binary');
        header('Connection: Keep-Alive');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . $length);

        set_time_limit(0);
        readfile($file);
    }

我一直在这里搜索谷歌几个小时。有什么帮助吗?

提前致谢。

似乎这还不够,这是我的整个php文件:

<div id="content">
  <div id="left" >
    left content
  </div>
  <div id="right">
    right content
  </div>
 </div>

1 个答案:

答案 0 :(得分:0)

如果您正在使用Apache2,我强烈建议您使用mod_xsendfile

如果运行Ubuntu或类似设备,可以使用以下命令安装:

sudo apt-get install libapache2-mod-xsendfile
sudo a2enmod xsendfile

然后在VirtualHost中打开XSendFile并提供批准的路径:

<VirtualHost *:80>
    ......
    <Directory "/var/www/music">
        Options FollowSymLinks
        AllowOverride All
        XSendFile On
        XSendFilePath /home/me/Music
        XSendFilePath /media/me/portable/Music
    </Directory>

然后要实际发送文件,您需要做的就是:

if(isset($_GET['f'])){
    if(is_dir($path.'/'.$_GET['f'])){
        display_files($path,$_GET['f']);
    }else{
        //send selected file
        header('X-SendFile: ' . $path.'/'.$_GET['f']);
        header("Content-type: audio/mpeg");
        header('Content-disposition: attachment; filename="'.basename($_GET['f'].'"'));
    }
}else{
    display_files($path);
}

在发送文件或重定向到空的下载页面之前,无需担心echo文本,因为我在发送文件之前有一个完整的目录列表和一些显示没有腐败。