«Недостатки» зависит от того, что вы пытаетесь выполнить.
Установив заголовок Location
, вы отправляете перенаправление. Браузер, действительно, получит ответ с кодом статуса HTTP 302 («Найдено») и новым URL-адресом ресурса. В основном, вы перенаправляете их на другой ресурс.
Для того, чтобы это сработало, ресурс, на который вы перенаправляете их, должен быть общедоступным. То есть: это должен быть существующий документ внутри «корня документа» вашего сервера.
Этот подход имеет определенные характеристики, которые, в зависимости от ваших требований, могут быть рассмотрены в качестве минусов:
- Как написано выше, ресурс должен быть общедоступным. Таким образом, вы не можете хранить файлы MP3 в отдельной, не доступной папке. Действительно, предположим, что ваш корневой каталог документа находится в
/var/www/public
, вы можете поместить эти файлы в не доступную папку, например /var/www/resources
, и обслуживать их только через ваши PHP-скрипты.
- Ваши пользователи получат URL-адрес ресурса, и поэтому они смогут напрямую обращаться к ресурсу, не проходя через ваш PHP-скрипт.
Если эти «характеристики» не подходят для вас, тогда вы можете избежать использования заголовка Location
.
Некоторые PHP код, чтобы служить MP3-файлы могут быть:
$file = 'local/path/to/your_audio_file.mp3'; // the path on the local file system - ie. don't use "http://www.example.com"!
header('Content-Description: File Transfer');
header('Content-Type: audio/mpeg'); // audio/mpeg is the correct mime type for mp3 files
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit; // Could be a good idea to exit at the end
Некоторые из заголовков могут быть лишними, но они, чтобы обеспечить наилучшую совместимость с различными браузерами. Я взял их (а затем адаптировал) от http://php.net/manual/en/function.readfile.php
Большое спасибо - это очень полезно. Я попробовал ваш код (только что изменил Content-Type, чтобы быть «application/zip», поскольку мои MP3-файлы сжаты), но получал zip-файл с нулевым размером файла. Немного больше googling предложил добавить ob_end_flush(), и это, похоже, сделало трюк (даже если я действительно не понимаю почему!). Если бы я мог задать один следующий вопрос: возможно ли сделать страницу (сообщение «ваша загрузка начнется в ближайшее время») во время загрузки, вместо того, чтобы иметь пустую страницу? Я немного экспериментировал, но, похоже, не мог разместить контент где-нибудь рядом с этим ... –
Это просто перенаправление. Сначала вы показываете страницу «загрузка», затем перенаправляете (перенаправление ) на страницу загрузки на php. Ps: zipping mp3 не нужен :) – Qualcuno
А, ок - это проще, чем я думал! Спасибо за вашу помощь. И я зацикливаюсь, потому что это целые альбомы (я старая школа!) –