INVERSER
INVERSER
Powerful web-based technologies
Powerful web-based technologies
Email:
Mobile:
YouTube

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

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

Возможно, этот файл (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

Получится что-то типа такого:

PHP отдача файла для загрузки

Задать вопрос

Отзывов пока нет
Хостинг для Вашего сайта
от 7$/365 дней
подробнее