загрузка — PHP: загрузка заголовка принудительно повреждена (файл MP3)

Я создаю простой сайт, который позволяет загружать песни. Тем не менее, мой скрипт загрузит файл mp3, но когда я пытаюсь открыть его, он каким-то образом поврежден.
Мало того, но размер файла значительно уменьшился.

Код:

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);
}

Я искал здесь и Google в течение нескольких часов. Любая помощь?

Заранее спасибо.

Кажется, этого было недостаточно, вот весь мой файл php:

<?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);
}

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текст перед отправкой файла или перенаправлением на пустую страницу загрузки, так как здесь у меня есть полный список каталогов, а некоторые отображаются перед отправкой файла без повреждений.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]