Проблема при скачивании файла с сервера

unlex

Новичок
Проблема при скачивании файла с сервера

Знаю, что подобный вопрос возникал здесь не один раз. Перерыл все топики по этой теме, но свою проблему не решил. Итак,
необходимо сделать что-то вроде файлового архива. Файлы заливаются на сервер (с этим всё нормально) с возможностью их дальнейшего скачивания посетителями сайта (здесь уже похуже). В общем есть скрипт:
PHP:
header("Pragma: no-cache"); 
header("Content-Description: file download");
header("Content-Type: application/octet-stream");	
header("Content-Length: ".(string)filesize($path.$file_name));
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Transfer-Encoding: binary\n");
if (!readfile($path.$file_name)) die("Ошибка");
pdf и mp3 файлы скачиваются без проблем, зато архивы, zip, rar и графические файлы jpg, gif и т.д не открываются после скачки с сервера, т.е. повреждены. Причем, если закомментировать строку
PHP:
 header("Content-Length: ".(string)filesize($path.$file_name));
то архивы при закачке уже не повреждаются, но графические файлы открыть так и не удаётся.
Пробовал различные mime типы, проблема не в этом. Что-то упирается в размер файла. После передачи он отличается от оригинала.

На http://www.php.net/header прочитал, что в этом случае необходимо добавлять ob_start(); и od_end_clean();
PHP:
ob_start();   		  				
header("Pragma: no-cache"); 
header("Content-Description: file download");
header("Content-Type: application/octet-stream");	
header("Content-Length: ".(string)filesize($path.$file_name));
header("Content-Disposition: attachment; filename=$file_name");
header("Content-Transfer-Encoding: binary\n");
if (!readfile($path.$file_name)) die("Ошибка"); 
od_end_clean();
Результат тот же. Может кто то знает в чем дело?
 

jonjonson

Охренеть
unlex, ну так дебаж. Сверяй чейксумму и размер файлов закачиваемых и скачеваемых. Если разные, значит идёт преобразование. Возможно апачем перекодируется (русским). Возможно ещё что-то. Кроме тебя никто не выяснит.
 

unlex

Новичок
Да, чексуммы не совпадают.
Apache/2.2.2 (Win32) PHP/5.2.5
понятия не имею в чем тут еще может быть дело
 

jonjonson

Охренеть
unlex, ну так разбирайся в том, что настроил :)
Опции касательно mime типов правились? Модули какие включались? А гадать должен?
 

unlex

Новичок
jonjonson,
Опции mime типов оставил по умолчанию. Модулей, которые могли бы повлиять на преобразование файлов при загрузке вроде бы не включал. Файл mime.types не трогал.
 

jonjonson

Охренеть
unlex, продолжаем гадать... Проблемы на локал хост или удалённо? Скачивание и закачивание происходит с одного хоста или с нескольких? Файлы сравнивадись, те что выбирались для закачки и скачанные или ещё те, что закачаны на хост и взяты для сравнения не через тривиальное скачивание, а из файловой стьемы, если хост, или по ftp если ремот хост? Я генератор идей для проверок и поиска глюков? Должен ли я посмотреть скрипты? Что ещё должен сделать я для решения проблемы unlex? :)
 

unlex

Новичок
jonjonson, проблемы на локальном хосте. скачивание и закачивание происходит с одного хоста. Сравнивались файлы которые закачаны на хост и те, что скачаны. проверял сравнением контрольной суммы. Скрипты я уже выложил. Что еще Я должен сделать для решения проблемы? )

спасибо за попытку помочь... тока пока что всё впустую, jonjonson )
 

jonjonson

Охренеть
Потому что не ищешь проблему, а гадаешь. И я с тобой дурь маюсь. :-\

Я вот ещё что насчёт readfile() вычитал в мануале...
To anyone that's had problems with Readfile() reading large files into memory the problem is not Readfile() itself, it's because you have output buffering on. Just turn off output buffering immediately before the call to Readfile(). Use something like ob_end_flush().
Только разве я это должен был вычитывать?
 

unlex

Новичок
Ставил я ob_end_flush() и перед readfile и после. и не readfile, а fpassthru применял непосредственно. Тока с бубном не плясал. Результат тот же.
jpg файлы повреждаются при передаче в ЛЮБОМ случае, архивы можно читать если не указывать хидером Content-Length, а mp3 и pdf корректно передаются в любом случае...
В случае jpg перебирал поочередно всевозможные mime типы как то 'image/jpeg','image/jpg','image/pjpeg' и еже с ними... не помогло, так что дело не в этом
 

dimagolov

Новичок
unlex
сухосин стоит в пхп?

у меня файлы отдаются ф-ей readfile_chunked из каментов к fread, то есть каждый блок читается в переменную, выводится через echo и сразу делается ob_flush(); flush(); для того, чтобы произошел вывод клиенту.

если играть в телепатов, то похоже, твоя проблема тут:
If you are trying to force a download from a script and you're having corrupted files, but the download was successful, just make sure you don't have spaces or news lines before and/or after <? script ?>
 

unlex

Новичок
До места все мои потуги. В общем все методы испробовал. Результата нет.
А у кого то может работает мой код, приведенный выше? Я бы не удивился....
 

dimagolov

Новичок
unlex, отдавать файл скриптом надо блоками, чтобы при отдаче большого файла скрипт не заваливался по превышению лимита памяти и отдавал клиенту тоже блоками. не читал исходников readfile, но так как дока по ней скудная, то ты бы не поленился, и написал бы блочный вывод так, как я советовал выше.
 
Сверху