Отдаем файл заголовками.

289
.
Сап, форум.
Понадобилась необходимость отдачи файлов заголовками, через php обработчик.
На данный момент я отдаю их так:
// получим размер файла
$fsize = filesize($filename);
// дата модификации файла для кеширования
$ftime = date("D, d M Y H:i:s T", filemtime($filename));
// смещение от начала файла
$range = 0;
 
// пробуем открыть
$handle = @fopen($filename, "rb");

// если не удалось
if (!$handle){
  header ("HTTP/1.0 403 Forbidden");
  exit;
}
 
// Если запрашивающий агент поддерживает докачку
if ($_SERVER["HTTP_RANGE"]) {
  $range = $_SERVER["HTTP_RANGE"];
  $range = str_replace("bytes=", "", $range);
  $range = str_replace("-", "", $range);
  // смещаемся по файлу на нужное смещение
  if ($range) fseek($handle, $range);
}
 
// если есть смещение
if ($range) {
  header("HTTP/1.1 206 Partial Content");
} else {
  header("HTTP/1.1 200 OK");
}
 
header("Content-Disposition: attachment; filename=".$object['name_lat']);
header("Last-Modified: {$ftime}");
header("Content-Length: ".($fsize-$range));
header("Accept-Ranges: bytes");
header("Content-Range: bytes {$range}-".($fsize - 1)."/".$fsize);
 
// подправляем под IE что б не умничал
if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
  Header('Content-Type: application/force-download');
else
  Header('Content-Type: application/octet-stream');
 
while(!feof($handle)) {
  $buf = fread($handle,512);
  print($buf);
}

Но, как оказывается, некоторые моб. браузеры, не распознают формат файла и сохраняют все файлы как .EXT.
Как побороть это?
.
# Windler (17.01.2014 / 13:41)
// если не удалось
if (!$handle){
header ("HTTP/1.0 403 Forbidden");
exit;
}
Почему не 500? Мне кажется, что так будет логичнее.
Попробуй для конкретного типа файла отдавать соответствующий заголовок. Больше ничего не сделаешь как мне кажется.
.
Сексуальность валенка
Но, как оказывается, некоторые моб. браузеры, не распознают формат файла и сохраняют все файлы как .EXT.
Как побороть это?

думаю не как!
.
# reaper (17.01.2014 / 13:52)
Почему не 500? Мне кажется, что так будет логичнее.
Попробуй для конкретного типа файла отдавать соответствующий заголовок. Больше ничего не сделаешь как мне кажется.
Жаль, потому что много строк выйдет.
.
Кадило крутится, лавэха мутится
fopen плохая идея для больших файлов.
Вот в принципе нормальные решения: http://habrahabr.ru/post/151795/
.
# Simba (17.01.2014 / 14:32)
fopen плохая идея для больших файлов.
Вот в принципе нормальные решения: http://habrahabr.ru/post/151795/
Пробовал первые две функции, тот же результат.
.
# Windler (17.01.2014 / 14:27)
Жаль, потому что много строк выйдет.
$mimes = require 'mimes.php';
$mime = $mimes[$ext];
.
Кадило крутится, лавэха мутится
# Windler (17.01.2014 / 14:38)
Пробовал первые две функции, тот же результат.
Последний попробуй. Самый оптимальный вариант.
.
Кадило крутится, лавэха мутится
И кстати да, мобилы не распознают потому что Content-Type не знают. По этому прописывай правильный тип
.
Решил проблему с помощью mime_content_type();
Всего: 13