Как отдать файл клиенту ?

StUV

Rotaredom
Как отдать файл клиенту ?

скажу сразу - в поиске был, в избранном тоже...

проблема такая - клиент запрашивает файл ГЕТ-запросом вида
index.php?id=xx ...
скрипт проверяет права доступа юзера - если все ОК - отправляет ему документ (должен это делать, но ...)
файл в формате .doc и лежит ВНЕ wwwroot, код:
PHP:
Header ("Content-Type: application/vnd.ms-word");
Header("Content-Length: ".filesize($filename));
Header ("Content-Disposition: attachment; filename=".$filename );
файл предлагается сохранить на диск под именем "index" (и все - ни расширения - ничего) - потом этот файл можно посмотреть в ворде и сохранить как *.doc.
Но если я пробую файл открыть - то открывается какая-то "лабуда" (хтмл-содержимое файла index... достаточно покореженное)
И если у клиента стоит ReGet (и т.п...), то файл вообще не закачивается и не открывается (во всех случаях начинается закачка файла "index").

В чем может быть проблема ? Какие хидеры еще можно попробовать ?
Всем спасибо
 

Ramzes

Новичок
PHP:
header("Content-Disposition: attachment; filename=".$file."\r\n");
header("Content-Type: application/octet-stream\r\n");
header("Content-Type: application/force-download\r\n");
header("Content-Type: application/download\r\n");
header("Content-Transfer-Encoding: binary\r\n");
header("Content-Length: " . filesize("/path/to/file/".$file));
должно работать )
 

StUV

Rotaredom
2Ramzes:
Спасибо, появились некоторые сдвиги, но проблема по-прежнему не решена:

после появления окна Открыть / Сохранить - если выбрать Открыть - то такое окно выскакивает еще два раза, после этого открывается файл *.doc, но в нем упомянутая хтмл-лабуда :(...
Если выбрать пункт Сохранить - то та же фигня сохраняется на диск, но с первого раза...
РеГет пытается закачать файл с правильным именем, но после 33% закачки постоянно обрывается и сообщает "Докачка не поддерживается, удаляем файл. Сервер неожиданно закрыл соединение"...

Есть еще мысли по этому поводу ?
Спасибо
 

Profic

just Profic (PHP5 BetaTeam)
PHP:
$file = 'filename.doc'; // никакого пути здесь не должно быть
$path = '/path/to/file';
header ('Content-Type: application/vnd.ms-word'); 
header ('Content-Disposition: attachment; filename=' . $file); 
header ('Content-Transfer-Encoding: binary'); 
header ('Content-Length: ' . filesize ($path . $file));

$fp = fopen ($path . $file, 'rb');
fpassthru ($dp);
fclose ($fp);
Можно еще поиграться с Range: для поддержки докачки
 

StUV

Rotaredom
вот такая конструкция:
PHP:
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=".basename($file));
header("Content-Length: ".filesize($file));
readfile($file);
exit;
(http://www.php.net/manual/ru/function.header.php)
помогла решить проблему (почти):
РеГет сохраняет файл в нужном виде, но не дает открыть файл сразу в браузере (возможно это решается настройкой РеГета и тп...).
Если появляется окно Открыть/Сохранить, то при выборе Открыть - это окно выскакивает еще раз и только потом открывается (Сохранить работает ОК)
Буду благогодарен за дальнейшую помощь :)...
 

Yuriy_S

-=PHP-Club=-
$filename="/path/to/file/filename.doc";
$file_name="file_name.doc";
header("Cache-control: private");
header("Content-type: application/force-download");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: filename=".$file_name);
readfile($filename);


Вот такая конструкция работает нормально.
В броузере работает точно нормально! %)
 

StUV

Rotaredom
2 Yuriy S:
Огромное-преогромное СПАСИБО!!!
Все заработало!
Тему можно закрывать :)
Всем спасибо.
 

Krisha

pain in the neck
а проверяли в NN 7.0, 7.01 имя файла нормальное приходит ?
 

StUV

Rotaredom
2Krisha:
действительно :)
в NN 7.0 к имени файла *.doc прибавляется еще .php (т.е. получается *.doc.php)
Как с этим бороться ?
 

tony2001

TeaM PHPClub
Sash [None]:
если кто-то захочет - решит.
попытки качать права в стиле "я не понял!?" ведут только уменьшению кол-ва желающих что-то кому-то решать.
 

Sash [None]

Новичок
tony2001: ну прости пожалуйста.... я вот например даже понятия не имею, с какой стороны подойти к этому вопросу. С подобной задачей столкнулся только сейчас. Хотя на РНР уже кое что написать могу, даже в савокупности с javascript, но всё знать не возможно... а вопрос я задал такой только потому что со дня последнего ответа по этому топику прошло уже больше месяца.
 

Krisha

pain in the neck
раз уж решили реанимировать топик, тогда еще один вопрос, а кто нить поборол такую фичу в IE, когда имя файла типа:
filename.sql.zip, то IE предлагает сохранить вот так:

filename[1].sql.zip
 

martinelli

Новичок
Автор оригинала: Yuriy_S
$filename="/path/to/file/filename.doc";
$file_name="file_name.doc";
header("Cache-control: private");
header("Content-type: application/force-download");
header("Content-Length: ".filesize($filename));
header("Content-Disposition: filename=".$file_name);
readfile($filename);


Вот такая конструкция работает нормально.
В броузере работает точно нормально! %)
попробовал у себя - файлы.doc открывает чудно, а файлы.zip портит, как будто передает их в текстовом формате. Причем когда раньше была прямая ссылка типа www.../../filename.zip проблемы с форматом не было. Посоветуйте как быть.:confused:
 

martinelli

Новичок
Вот уже полтора часа честно занимаюсь поиском. Нашел несколько форумов, где обсуждаются подобные проблемы, опробовал несклолько разных способов, но результата не добился.
Зануда, если ты можешь помочь, будь добр помоги.
Можно перенести обсуждение на форум "Битые файлы получаются", там эта тема так и заглохла.
Пример с форума "Нужно скачать файл в нужном Content-Type" у меня почемуто не работает :(
 
Сверху