Недавно я столкнулся с интересной проблемой. На одном сайте нужно было реализовать прослушивания (онлайн) и скачивания mp3 файлов. Вроде ничего сложного – все сделал, реализовал скрипт на php загрузки файлов с подсчетом количества скачиваний, все работает – файлы проигрываются и даже скачиваются без проблем. Но через некоторое время выяснилось, что со скачиванием есть одна маленькая, но очень обидная, проблема. Так как я пользуюсь браузером Опера, я этого сначала не заметил, поскольку опера скачивала все как надо – спросила: открыть или скачать, все ок. А Интернет Эксплорер выявился не такой вежливый – он не спрашивал, он просто по умолчанию запускал Медиа-плеер. А для рядового пользователя скачать этот mp3-файл оказывается довольно тяжело.
Такая проблема может возникнуть и с другими типами файлов (doc, pdf, xls, jpg, gif и т.д.), будет запускаться, ассоциируемая с этим типом файла, программа. А не всегда это удобно, и это нам нужно.
Пришлось не мало перелопатить интернета, чтобы найти подходящее решение (точнее подходящий php-скрипт) для меня.
Провожу вашему вниманию - PHP скрипт для скачивания файлов:
<?php
$filename = $_GET['filename'];
// нужен для Internet Explorer, иначе Content-Disposition игнорируется
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
$file_extension = strtolower(substr(strrchr($filename,"."),1));
if( $filename == "" )
{
echo "ОШИБКА: не указано имя файла.";
exit;
} elseif ( ! file_exists( $filename ) ) // проверяем существует ли указанный файл
{
echo "ОШИБКА: данного файла не существует.";
exit;
};
switch( $file_extension )
{
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "mp3": $ctype="audio/mp3"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // нужен для некоторых браузеров
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename)); // необходимо доделать подсчет размера файла по абсолютному пути
readfile("$filename");
exit();
?>
Данный скрипт поможет вам управлять скачиванием файлов с вашего сайта. Не допускать браузерам запускать ассоциированную программу с данным файлом по умолчанию (mp3, doc, pdf и т.д.), а всегда спрашивать у пользователя что нужно делать (открыть или сохранить).
Создайте файл dl_save.php скопируйте туда код.
Ссылку на скачивания файла оформлять нужно (примерно) так:
<a href="dl_save.php?filename=file.mp3">Скачать</a>
Где file.mp3 – заменяйте своим файлом, если нужно, прописывайте полный путь к файлу (и путь к dl_save.php).
Если через редирект:
header("Location: dl_save.php?filename=file.mp3");
Дальше: Создание сайта недвижимости (агентства недвижимости)
Дискуссия по теме 70 Комментариев
Добавить комментарий
Konstantin 26.11.2017 ? 06:13
Скрипт конечно классный. НО! Это огромная дырень в безопасности Вашего сайта :) Просто вместо мп3-шки вписываем туда index.php или ЛЮБОЕ имя PHP-файла на Вашем сервере и СКАЧИВАЕМ СКРИПТЫ! А в скриптах уже что угодно будет - и логины-пароли от баз данных... и внутренняя логика работы сайта... можно слить всё, что хошь! :) За изобретение - ПЯТЬ! За безопасность - ДВА! :))))
Igor 20.02.2017 ? 19:22
Здравствуйте! Скрипт отлично работает на ПК , а вот для телелфона этот вариант неработает (подскажите как чтоб и телефон скачивал)? Спасибо!
Дмитрий 19.12.2015 в 14:19
При скачивании jpg файла не открывает его. Пишет файл поврежден или является слишком большим.
Владимир 17.10.2015 в 21:44
Спасибо, работает как часы. Много где что предлагали, но как ни странно не работало. Автору )
Ya 03.05.2015 в 19:08
У меня при нажатии на ссылку СКАЧАТЬ в этом же окне открывается вот что: %PDF-1.5 %
Dima 13.12.2014 в 23:23
НЕ поленюсь и напишу :) СПАСИБО! РАБОТАЕТ! ОБЛЕГЧИЛИ ЖИЗНЬ! 1 К КАРМЕ
Дмитрий 22.08.2014 в 02:27
Огромное спасибо, очень помогли!
Mrgord 30.06.2014 в 18:14
Sasha 28.02.2014 в 20:32
Добрый день. Как сделать так, чтобы загрузка файлов была с другого сайта? У меня на сайте ссылки с Dropbox вида: https://dl.dropboxusercontent.com/u/31217182/Ringtons/inna-alright.mp3 Помогите, очень нужно
Exvayn 06.12.2013 в 10:30
если ссылка ведет на php документ, который в свою очередь редиректируется на файл, то скрипт не будет работать?
Тарас 07.12.2013 в 00:05
Ирина 09.11.2013 в 20:14
Подскажите пожалуйста подойдет этот скрипт для генератора поздравительного письма? Есть шаблон(фон-картинка), на который пользователь пишет свой текст и генерируется письмо. Затем чтобы распечатать его пользователь сохраняет его в файл (т.к. не у всех есть цветные принтеры) Подойдет ли ваш скрипт для такой цели? Сейчас письмо генерирует и его можно только распечатать. при сохранении же сохраняется только фон-картинка без текста.
Тарас 10.11.2013 в 17:17
В каком формате генерируется письмо? Это картинка или html документ?
andronick83 08.11.2013 в 03:38
Для скачки файла достаточно просто добавить ссылке атрибут download: <a href="file.mp3" download="имя-файла.mp3">Скачать</a> И ненужно никаких скриптов.
Роман 03.03.2014 в 11:42
Кристина 21.09.2013 в 09:30
Здравствуйте! Помогите пожалуйста, сделала все по правилам,но при нажатии на ссылку загружается пустая страница и при этом файл скачивается. Уже и одинарные кавычки поставила и полный адрес файла накалякала, ничего не получается. Что сделать не знаю.
Михаил 17.09.2013 в 00:36
В браузерах Опера-некст и Яндекс качает без предупреждения. В Гугл-хром предлагает только сохранить. Поправить можно?
didsico 14.09.2013 в 12:23
А где прописывается путь до файлов? Как реализовать подсчет скачиваний?
Тарас 14.09.2013 в 23:58
Путь к файлам прописывается так: dl_save.php?filename=file.mp3 Подсчет можно реализовать внутри этого php файла... хоть в бд пиши, хоть в файл... еще есть готовый скрипт для подсчета скачиваний - http://sitear.ru/material/schetchik-skachivanij-faila
Дмитрий 26.08.2013 в 11:57
Добрый день! Всё поставил, как написано, но выдаёт ошибку 404.
Тарас 26.08.2013 в 20:10
Ищите проблему в самом движке... этот код не может выдавать ошибку 404, в любом случае будет приходить код ответа сервера 200, даже если нету файла. Возможно доступ к php файлу запрещен условиями в .htaccess
Дмитрий 26.08.2013 в 20:25
Разобрался. Всё отлично работает. Скрипт просто ОТЛИЧНЫЙ! Спасибо Вам за труды!)
Дмитрий 26.08.2013 в 09:33
Подскажите, а на Денвере этот код работает? Спасибо!
Максим 23.08.2013 в 00:13
Все поставил, все как бы работает, но есть одна БОЛЬШАЯ проблема. После скачивания изображения в формате jpg пытаюсь его открыть на компе, а не выходит "Просмотр недоступен". В чем может быть причина?
Сергей 21.07.2013 в 21:15
Автор огромнейшее спасибо!!! Очень выручил!!! Всё отлично работает!!! Устал я интернет со всякими непонятными штуками перекапывать. А тут готовый вариант! Респект и уважуха!!
биржа труда 18.07.2013 в 09:24
Не плохой скрипт вполне может пригодится для скачки бланков резюме.
Дмитрий 02.07.2013 в 00:50
Спасибо огромное! Скрипт СУПЕР!!!
Irisha 24.05.2013 в 16:28
Любой браузер (IE, GC...) вместо того, чтобы спросить, что делать (сохранить/открыть) "пишет" абракадабру из mp3-файла. Почему?
Sveta 18.04.2013 в 21:34
спасибо огромное за уделенное время! Все получилось. Спасли меня.
Sveta 09.04.2013 в 21:41
помогите, пожалуйста. Создала файл dl_save.php в корне папки сохранила, файл который будут скачивать туда же положила. <a href="dl_save.php?filename=p1.xls" >Прайс</a> только у меня теперь когда заходишь на эту страницу где ссылка для скачивания файла пишет ошибку: "Parse error: syntax error, unexpected T_STRING in ..." Что с этим делать? Я в этом деле не сильна пока.
Тарас 10.04.2013 в 00:50
В какой строке выдает ошибку? в конце ошибки должно быть in line далее цифра... цифра это строка кода в которой ошибка.
Sveta 10.04.2013 в 16:31
Я проверила, номер строки который пишут в этой ошибке, совпадает со строкой кода <a href="dl_save.php?filename=p1.xls" >Прайс</a>
Sveta 16.04.2013 в 22:38
Помогите, пожалуйста с этим. Что можете посоветовать?
Тарас 17.04.2013 в 12:49
Можете прислать мне файл на почту tarik_alka[собака]mail.ru Посмотрю код.
Sveta 17.04.2013 в 17:58
Я вам отправила, посмотрите, пожалуйста.
Тарас 17.04.2013 в 23:01
Синтаксическая ошибка. Вместо двойных скобок (") используйте одинарные (') в этой строке кода. Вот так: <a href='dl_save.php?filename=p1.xls'>Прайс</a>
Леша 26.03.2013 в 00:17
Уменя все время выдает "Не указано имя файла". В самом PHP меняется только имя файла или что-то еще? Путь перед именем файла в РНР не надо прописывать? А здесь тоже все остается как есть? case "pdf": $ctype="application/pdf"; break; default: $ctype="application/force-download"; Спасибо!
Тарас 26.03.2013 в 01:31
путь надо тоже прописывать перед именем файла.
Леша 28.03.2013 в 23:23
Тарас, нельза ли вам потать код? У меня все равно скрипт не находит файла для скачивания.Если можно то куда?
Леша 28.03.2013 в 23:59
Я имел в виду ПОСЛАТЬ код :-)
Тарас 29.03.2013 в 00:38
Присылайте на tarik_alka[собака]mail.ru
Леша 01.04.2013 в 19:13
Тарас, вы получили код? Я его уже послал два раза ;-)
Тарас 03.04.2013 в 14:34
Да получил. Скрипт "думает" что ваш файл по адресу php/files/manuals.pdf Так как этот срипт содержиться в папке php, ему необходимо подняться на уровень высше а потом переходить по пути files/manuals.pdf Попробуйте поместить файл скрипта в корневую папку... так будет проще. Или же пропишите путь так: ../files/manuals.pdf хотя не уверен что этот путь будет работать.
Александр 01.01.2013 в 05:11
Тарас спасибо, но одна ошибочка у тебя. Надо: <a href="http://вашсайт.ру/dl_save.php?filename=film/film.mp4">Скачать</a></p> - не надо перед папкой film ставить черточку. Все получилось, еще раз огромное спасибо автору!!!
Александр 29.12.2012 в 17:37
Отличный скрипт! Перед dl_save.php? поставил адрес моего сайта. Скрипт находится в корне. Не могу поставить путь для скачивания( адрес сайта/film/film.mp4)куда и как его поставить в ссылку? Если не ставить адрес файла то он скачивается по умолчанию из корня, что не очень то удобно. Help! Спасибо
Тарас 30.12.2012 в 23:14
Правильно будет так: dl_save.php?filename=/film/film.mp4 или так: http://вашсайт.ру/dl_save.php?filename=/film/film.mp4
Zura 12.12.2012 в 18:09
Огромное спасибо!У меня скачивание перебивал QuickTime и вместо скачивания начинал проигрывать.Данным способом решил эту проблему. Отличный материал!!!
марлен 09.11.2012 в 16:25
если это бесконечный поток mp3 можно его сделать как нибудь на скачивание? спасибо
Анья 24.10.2012 в 18:41
Почему у меня не работает? В чем причина?
Тарас 24.10.2012 в 23:37
Да в чем угодно. Что пишет? Какую ошибку выдает? Если есть дайте ссылку на пример...