Имя: Пароль:
IT
 
Помогите плз с PHP, какой то траб с размерам файла:
,
0 megabax
 
12.10.12
09:47
Добрый день. Написал прогу, которая создате временные ссылки на скачивания файлов, ссылка типа такой:
http://www.easyprog.ru/shop/download.php?uid=всякие шифры и буквы
если файл маленький, она его скачивает нормально. А вот на файлах больших (пробовал 90 мб, 50 мб, 25 мб, 10 мб) скачивает только первые 1011, естетсвенно, запортив сам файл
Вот фрагмент кода скачивания файла:
   $ctype = 'application/octet-stream';
   $filename="имя файла";
   $handle = @fopen($filename, 'rb');
   $fsize = filesize($filename);
   $ftime = date( 'D, d M Y H:i:s T', filemtime($filename ) );
   $range = 0;
   
   header( 'Content-Type: '.$ctype );
   header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
   header( 'Last-Modified: '.$ftime );
   header( 'Content-Length: '.($fsize-$range) );
   header( 'Accept-Ranges: bytes' );
   header( 'Content-Range: bytes '.$range.'-'.($fsize - 1).'/'.$fsize );

   readfile($filename);
   fclose($handle);
Подскажите плз, что я неправильно сделал?
1 BigHarry
 
12.10.12
13:09
Я бы еще добавил:
header('Content-Transfer-Encoding: binary')

И проверил бы правильность величин, которые идут в заголовках
header( 'Content-Length: '.($fsize-$range)
header( 'Content-Range: bytes '.$range.'-'.($fsize - 1).'/'.$fsize )
2 ДайтеДайте Сказать
 
12.10.12
13:14
(0) readfile($filename);
3 megabax
 
12.10.12
15:05
1, сделал временно вот так:
   $ctype = 'application/octet-stream';
   $filename="имя файла";
   //$filename="1.pdf";
   $handle = @fopen($filename, 'rb');
   $fsize = filesize($filename);
   $ftime = date( 'D, d M Y H:i:s T', filemtime($filename ) );
   $range = 0;

   echo( 'Content-Length: '.($fsize-$range)."<br>" );
   echo( 'Content-Range: bytes '.$range.'-'.($fsize - 1).'/'.$fsize );
   
   
   /*header( 'Content-Type: '.$ctype );
   //header( 'Content-Transfer-Encoding: binary')
   header( 'Content-Disposition: attachment; filename="'.$filename.'"' );
   header( 'Last-Modified: '.$ftime );
   header( 'Content-Length: '.($fsize-$range) );
   header( 'Accept-Ranges: bytes' );
   header( 'Content-Range: bytes '.$range.'-'.($fsize - 1).'/'.$fsize );


   readfile($filename);
   fclose($handle);*/

выдало:
"Warning: filesize() [function.filesize]: stat failed for ...
...
Content-Length: 0
Content-Range: bytes 0--1/"
что то видимо filesize глючит на больших файлах, не подскажите альтернатитву
???
4 BigHarry
 
12.10.12
15:26
Может дело во времени жизни скрипта, он прерывается по max_execution_time и не успевает большой файл отдать?
5 megabax
 
12.10.12
15:30
4, вообще то скрипт сразу начинает качать файл и сразу же заканчивает
но ежели  и так, тогда почему  filesize() возырвщает нуль и интерпертатор варинингутеся на эту функцию?
6 BigHarry
 
12.10.12
15:39
filesize использует кэш, если у вас имена временных файлов совпадают - может быть трабл. Попробуй еще filesize вызвать до открытия файла.
7 megabax
 
12.10.12
15:53
6, попробовал, не помогло.
И еще интересный момент.
У меня файл назывался Quik и Metatrader 1_2.part01.rar, и функция filesize на него материлась (warning). Поменял имя файла сделал его StockBots1Video.rar, длина 90 метров. Теперь функция filesize возвращает нормально, но файл все равно не читается нормально, в диалоге открытия показывает, что его длина всего 203 байт.
8 megabax
 
12.10.12
15:56
Вот еще интересно. Сделал файл 1.rar весом 10 метров (Quik и Metatrader 1_2.part01.rar переименовал в 1.rar), он его нормлаьно прожевал). Как то старнно получается....
9 BigHarry
 
12.10.12
16:14
На юниксо-линуксовых ФС регистр букв в названии файла играет роль, может поэтому функции ругаюццо...
10 megabax
 
12.10.12
16:27
9, дык я вроде как имя файла копировал вставил, не ручками набирал...
Может, дело в точке в имени файла?
Кстати, я попробовал сделать файл весом 50 метров, прожевало, а вот 90 метров уже почему то не хочет
11 BigHarry
 
12.10.12
16:28
Может что-то в логах php или вэб-сервера имеется?
12 megabax
 
12.10.12
16:37
ХЗ, попробую уточнить в техподдрежке. Хотя, проблему кажется решил другим путем: разбил файл на два раром, по 50 скиптр вроде прожевывает, если вместо Quik и Metatrader 1_2.part01.rar поставить какое то нормальное имя, например 1.rar. Буде значит две ссылки на скачивание
13 raykom
 
12.10.12
21:25
(0)В панели управления хостингом в настройках модуля ПХП
upload_max_filesize увелич до необходимого значения. Или попроси хостера.
14 megabax
 
12.10.12
21:51
13, спасибо, попробую
15 BigHarry
 
12.10.12
22:06
upload_max_filesize это для передачи данных в сторону сервера, на отдачу не влияет.
16 Asmody
 
12.10.12
22:13
(10) пробелы и прочую фигню в именах файлов экранировать надо
17 Asmody
 
12.10.12
22:14
нафиг вообще статику пэхэпой отдавать — вот что мне не понятно
18 BigHarry
 
12.10.12
22:19
(17) У него не статика, а "временные ссылки для скачивания" :)
19 Asmody
 
12.10.12
23:25
20 BigHarry
 
13.10.12
00:14
(19) На простом хостинге такие фокусы, к сожалению, не прокатят...