Php файл скачать испорченные аудио файлы - PullRequest
0 голосов
/ 31 августа 2018

Я программировал загрузчик файлов с помощью php для загрузки некоторых аудиофайлов (.mid, .wav, .mp3) с моего веб-сайта. Кажется, загрузка работает нормально, но когда я пытаюсь воспроизвести загруженный файл, Windows Media Player говорит:

Проигрыватель Windows Media не может воспроизвести файл. Проигрыватель может не поддерживать тип файла или может не поддерживать кодек, который использовался для сжатия файла.

Я посмотрел файлы с программным обеспечением для редактирования текста и заметил, что у всех «поврежденных» файлов есть дополнительный разрыв строки и «» в начале файла:

НОРМАЛЬНЫЙ Файл

RIFF † WAVEfmt D¬ ± data @ SÿSÿkÿkÿu o ÷ ½ [+ eŸ0a / ô> T = êFE] JjHLJ¶P — NÊU… S ‡ [Y _b \ ‘^ × [èZ» XïS3Q

ИСПРАВЛЕННЫЙ Файл:

RIFF † WAVEfmt D¬ ± data @ SÿSÿkÿkÿu o ÷ ½ [+ eŸ0a / ô> T = êFE] JjHLJ¶P — NÊU… S ‡ [Y _b \ ‘^ × [èZ» XïS3Q

Когда я удалил разрыв строки и тег , аудиофайл снова заработал. Вот мой скрипт загрузки файлов:

$eyr = html_entity_decode($_GET['fileUrOpening']);

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=".$eyr); 
header('Pragma: public');
readfile($eyr);

Он вызывается из другого скрипта:

 $result = queryMysql("SELECT * FROM fichierschants WHERE chant = '$id';");
  $files = $result->num_rows;

  if ($files == 0) {
    echo '<td> There are no files for this song</td>';
  }else{

    echo '<td>';
    for ($i = 0 ; $i < $files ; ++$i){
        $result->data_seek($i); 
        $eode = $result->fetch_assoc()['emplacement'];
        echo'<a href="./readingFile.php?fileUrOpening=';
        echo $eode;
        echo '"">';
        $result->data_seek($i); 
        echo $result->fetch_assoc()['emplacement']."</a> <br>";
    }
    echo'</td>';
}

Я пробовал много разных предложенных способов загрузки своих файлов, но ни один из них, похоже, не работает должным образом.
Любая помощь будет принята с благодарностью,
Алекс.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я наконец узнал, что очистка выходных буферов:

while (ob_get_level()) { ob_end_clean(); }

прямо перед вызовом readfile (), чтобы избежать повреждения файла!

Спасибо за все ваши предложения, я также добавил их в свой сценарий.

Хорошего дня,

Alex

0 голосов
/ 31 августа 2018

application/octet-stream определяется как «произвольные двоичные данные» в RFC 2046. Может быть, попробуйте использовать правильный заголовок для аудиофайла? Вы можете получить информацию mime файла, чтобы определить, следует ли использовать Content-Type: audio/mpeg или эквивалент для .wav или .mid.

Кроме того, если сценарий вызывается откуда-то еще, убедитесь, что вывод не выводится. Я полагаю, что нет, иначе вы не сможете отправлять заголовки должным образом, но стоит проверить ваш error_log. Datalist - это HTML-тег, поэтому мне кажется, что этот тег произошел ранее в вашем скрипте, возможно, с буферизацией вывода или чем-то еще. В любом случае, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...