Если Вам необходимо правильно отдавать файл для загрузки пользователю для всех современных браузеров, то данный пример поможет Вам в этом.
1 Шаг.
Для начала проверим размер файла:
//filesize
function fsize($path){
$fp=fopen($path,'r');
$inf=stream_get_meta_data($fp);
fclose($fp);
foreach($inf['wrapper_data'] as $v){
if(stristr($v,'content-length')){
$v=explode(':',$v);
$inbytes=trim($v[1]);
}
}
header('Content-Length:'.$inbytes);
if($inbytes==0){
return false;
}else{
if($inbytes>=1024){
return true;
}else{
$inbytes=round($inbytes,0);
return true;
}
}
}
//OFF filesize
Данная функция принимает один параметр - ссылку на удаленный файл (который может находиться на другом сервере или внутри данного сервера).
Например, её можно использовать так:
fsize('https://site.org/file.txt');
2 Шаг.
//если размер файла не равен 0 (неотрицательное значение, то мы отдаем его для загрузки браузеру)
if(!fsize($url)){
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($url));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile($url);
}
Итог. Если файл имеет размер, больший 0, то мы отдаем его для скачивания браузеру. При этом, любой файл будет отдаваться для загрузки, а не открываться в браузере, например видео или текстовый файл.
Возможно, этот файл даст больше информации...
Используя функцию получения размера файла, мы также получаем некоторые данные о файле, а именно:
var_dump(fileSizeIn($url));
exit;
Результат:
array(2) { [0]=> string(6) "229 MB" [1]=> string(19) "Mon, 11 Sep 2017 12" }
Получив данный массив, мы можем вывести пользователю дату изменения файла:
$fileSize=NULL;
$fileDate=NULL;
$i=0;
foreach(fileSizeIn($url) as $q){
if($i==0)$fileSize=$q;
if($i==1)$fileDate=$q;
$i++;
}
После чего, мы можем вывести пользователю данные таким образом:
$fileDate=explode(' ',$fileDate);
//получаем день, когда файл был изменен
switch($fileDate[0]){
case'Sun,':
$day='Воскресенье';
break;
case'Mon,':
$day='Понедельник';
break;
case'Tue,':
$day='Вторник';
break;
case'Wed,':
$day='Среда';
break;
case'Thu,':
$day='Четверг';
break;
case'Fri,':
$day='Пятница';
break;
case'Sat,':
$day='Суббота';
break;
}
//получаем месяц, когда файл был изменен
switch($fileDate[2]){
case'Jan':
$month='января';
break;
case'Feb':
$month='февраля';
break;
case'Mar':
$month='марта';
break;
case'Apr':
$month='апреля';
break;
case'May':
$month='мая';
break;
case'Jun':
$month='июня';
break;
case'Jul':
$month='июля';
break;
case'Aug':
$month='августа';
break;
case'Sep':
$month='сентября';
break;
case'Oct':
$month='октября';
break;
case'Nov':
$month='ноября';
break;
case'Dec':
$month='декабря';
break;
}
echo 'Дата изменения файла: '.$day.', '.$fileDate[1].' '.$month.' '.$fileDate[3].' года';
Функция получения типа файла по ссылке:
function ftype($link){
$path_parts=pathinfo($link);
return $path_parts['extension'];
}
Использовать так:
ftype($url);
Получение базового имени файла по ссылке:
basename($url);
Например:
basename('https://site.org/folder/folder2/folder3/filename.txt');
Выведет:
filename.txt
Получится что-то типа такого: