PHP Curl mp3下载重置元数据

时间:2013-08-29 15:37:28

标签: php curl download mp3

我正在建立一个下载mp3的网站,当我通过php(curl)下载时,该歌曲被下载但是歌曲的元数据如专辑封面,艺术家姓名等都丢失了。

在服务器上,文件包含所有数据,但在下载时,所有内容都将丢失。 继承我的代码:

if (!empty($path) && $path != null)
            {
                $ch = curl_init($path);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HEADER, true);
                $data = curl_exec($ch);
                curl_close($ch);
                if ($data === false)
                {
                    echo 'CURL Failed';
                    exit;
                }

                if (preg_match('/Content-Length: (\d+)/', $data, $matches))
                {
                    $contentLength = (int) $matches[1];
                }

                header("Pragma: public");
                header("Expires: 0");
                header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                header("Cache-Control: private", false); // required for certain browsers
                header('Content-Type: audio/mpeg');
                header("Content-Disposition: attachment; filename=\"" . urlencode($song->title) . ".mp3\";");
                header('Content-Transfer-Encoding: binary');
                header('Content-Length: ' . $contentLength);
                ob_clean();
                flush();
                echo $data;
                exit;
            }

1 个答案:

答案 0 :(得分:0)

你强迫curl将hTTP响应标头添加到你的mp3文件中,所以你会得到类似的东西:

HTTP/1.1 ...
Content-type: audio/mpeg
Content-length: 12345

ID3v2.......
mp3 data here

由于ID3数据不在您发送的数据的开头,因此音频播放器无法找到它,因为它看到的只是HTTP标头。

如果您对这些标题所做的只是提取内容长度,那为什么还要费心呢?您可以在PHP中使用strlen()为您计算它。 e.g。

$mp3data = file_get_contents('url to mp3 file');
$length = strlen($mp3data);

header("Content-length: $length");
echo $mp3data;