Download + докачка = "битому" файлу

FedY@

Новичок
Download + докачка = "битому" файлу

Есть функция - она качает только видео файлы на данный момент... если скачиваем через простой ИЕ файлы больше 600 мб обрываются... а если работать с докачивальщиком - то файлы получаются битые! Битые не в размере, а в том что фильм например не запускается или например идёт не 1час40мин, а 30мин ... в чём проблема?

PHP:
function send_file_to_download($path,$name = NULL) 
{ 
	
$filename = basename($path);
$ext = substr($filename, strlen($filename)-3);

switch($ext){
	case "mp2":
	case "mpa":
	case "mpe":
	case "mpeg":
	case "mpg":
	case "mpv2":
	case "mp2":
		$mime_type="video/mpeg";
		break;
	case "mov":
	case "qt":
		$mime_type="video/quicktime";
		break;
	case "lsf":
	case "lsx":
		$mime_type="video/x-la-asf";
		break;
	case "asf":
	case "asr":
	case "asx":
		$mime_type="video/x-ms-asf";
		break;
	case "avi":
		$mime_type="video/x-msvideo";
		break;
	default:
		$mime_type="application/octet-stream";
}

 $fp = fopen($path,'rb'); 
 if (!$fp) {return FALSE;} 
 ob_end_clean(); 
 ob_implicit_flush(1); 
 $s = $size = get_ftpfile_size($path); 
 $start = 0; 
 if (isset($_SERVER['HTTP_RANGE'])) 
 { 
  header('HTTP/1.1 206 Partial Content'); 
  preg_match('~^bytes=(\d+)?\-(\d+)?$~',$_SERVER['HTTP_RANGE'],$m); 
  if (isset($m[1])) {$start = $m[1]; fseek($fp,$m[1]); $s -= $m[1];} 
  if (isset($m[2])) {$s -= $m[2];} 
 } 
 header('Content-Disposition: attachment; filename='.($name !== NULL?$name:basename($path))); 
 header('Last-Modified: '.date('D, d M Y H:i:s T',filemtime($path))); 
 header('Accept-Ranges: bytes'); 
 header('Content-Length: '.$s); 
 header('Content-Range: bytes '.$start.'-'.$s.'/'.$size); 
 header('Content-type: '.$mime_type); 
 $g = 0; 
 while (!feof($fp) and $fp) 
 { 
  $buf = fread($fp,1024*2); 
  $g += strlen($buf); 
  if ($g > $s) {$v = $g-$s; echo substr($buf,0,-1*$v); break;} 
  else {echo $buf;} 
 } 
}
 

FedY@

Новичок
Автор оригинала: tf
FedY@, пофикси пост от ненужных строк
от каких не нужных строк? всё нужно... а если кто-то захочет поюзать ?
просто свич переделать и соединить кейсы... вот и все!

-~{}~ 06.01.07 03:04:

всё сделал... теперь, ПОЧЕМУ МОЙ СКРИПТ КАЧАЕТ И ДЕЛАЕТ БИТЫЙ ФАЙЛ?
 

avm

Новичок
1) Скорее всего на хостинге стоит "русский apache". В файле .htaccess впишите:
CharsetDisable On

2) ваш скрипт не увидит "mpeg", "mpv2" и "qt"...
 

WP

^_^
FedY@
А где мой копирайт? :D

PHP:
if (!function_exists('mime_content_type'))
{
 function mime_content_type($filename)
 {
  static $mime = array(
		'ai' =>'application/postscript',			'aif' =>'audio/x-aiff',
			'aifc' =>'audio/x-aiff',				'aiff' =>'audio/x-aiff',
			'asc' =>'text/plain',					'atom' =>'application/atom+xml',
			'avi' =>'video/x-msvideo',				'bcpio' =>'application/x-bcpio',
			'bmp' =>'image/bmp',					'cdf' =>'application/x-netcdf',
			'cgm' =>'image/cgm',					'cpio' =>'application/x-cpio',
			'cpt' =>'application/mac-compactpro',	'crl' =>'application/x-pkcs7-crl',
			'crt' =>'application/x-x509-ca-cert',	'csh' =>'application/x-csh',
			'css' =>'text/css',						'dcr' =>'application/x-director',
			'dir' =>'application/x-director',		'djv' =>'image/vnd.djvu',
			'djvu' =>'image/vnd.djvu',				'doc' =>'application/msword',
			'dtd' =>'application/xml-dtd',			'dvi' =>'application/x-dvi',
			'dxr' =>'application/x-director',		'eps' =>'application/postscript',
			'etx' =>'text/x-setext',				'ez' =>'application/andrew-inset',
			'gif' =>'image/gif',					'gram' =>'application/srgs',
			'grxml' =>'application/srgs+xml',		'gtar' =>'application/x-gtar',
			'hdf' =>'application/x-hdf',			'hqx' =>'application/mac-binhex40',
			'html' =>'text/html',					'html' =>'text/html',
			'ice' =>'x-conference/x-cooltalk',		'ico' =>'image/x-icon',
			'ics' =>'text/calendar',				'ief' =>'image/ief',
			'ifb' =>'text/calendar',				'iges' =>'model/iges',
			'igs' =>'model/iges',					'jpe' =>'image/jpeg',
			'jpeg' =>'image/jpeg',					'jpg' =>'image/jpeg',
			'js' =>'application/x-javascript',		'kar' =>'audio/midi',
			'latex' =>'application/x-latex',		'm3u' =>'audio/x-mpegurl',
			'man' =>'application/x-troff-man',		'mathml' =>'application/mathml+xml',
			'me' =>'application/x-troff-me',		'mesh' =>'model/mesh',
			'mid' =>'audio/midi',					'midi' =>'audio/midi',
			'mif' =>'application/vnd.mif',			'mov' =>'video/quicktime',
			'movie' =>'video/x-sgi-movie',			'mp2' =>'audio/mpeg',
			'mp3' =>'audio/mpeg',					'mpe' =>'video/mpeg',
			'mpeg' =>'video/mpeg',					'mpg' =>'video/mpeg',
			'mpga' =>'audio/mpeg',					'ms' =>'application/x-troff-ms',
			'msh' =>'model/mesh',					'mxu m4u' =>'video/vnd.mpegurl',
			'nc' =>'application/x-netcdf',			'oda' =>'application/oda',
			'ogg' =>'application/ogg',				'pbm' =>'image/x-portable-bitmap',
			'pdb' =>'chemical/x-pdb',				'pdf' =>'application/pdf',
			'pgm' =>'image/x-portable-graymap',		'pgn' =>'application/x-chess-pgn',
			'php' =>'application/x-httpd-php',		'php4' =>'application/x-httpd-php',
			'php3' =>'application/x-httpd-php',		'phtml' =>'application/x-httpd-php',
			'phps' =>'application/x-httpd-php-source','png' =>'image/png',
			'pnm' =>'image/x-portable-anymap',		'ppm' =>'image/x-portable-pixmap',
			'ppt' =>'application/vnd.ms-powerpoint','ps' =>'application/postscript',
			'qt' =>'video/quicktime',				'ra' =>'audio/x-pn-realaudio',
			'ram' =>'audio/x-pn-realaudio',			'ras' =>'image/x-cmu-raster',
			'rdf' =>'application/rdf+xml',			'rgb' =>'image/x-rgb',
			'rm' =>'application/vnd.rn-realmedia',	'roff' =>'application/x-troff',
			'rtf' =>'text/rtf',						'rtx' =>'text/richtext',
			'sgm' =>'text/sgml',					'sgml' =>'text/sgml',
			'sh' =>'application/x-sh',				'shar' =>'application/x-shar',
			'shtml' =>'text/html',					'silo' =>'model/mesh',
			'sit' =>'application/x-stuffit',		'skd' =>'application/x-koan',
			'skm' =>'application/x-koan',			'skp' =>'application/x-koan',
			'skt' =>'application/x-koan',			'smi' =>'application/smil',
			'smil' =>'application/smil',			'snd' =>'audio/basic',
			'spl' =>'application/x-futuresplash',	'src' =>'application/x-wais-source',
			'sv4cpio' =>'application/x-sv4cpio',	'sv4crc' =>'application/x-sv4crc',
			'svg' =>'image/svg+xml',				'swf' =>'application/x-shockwave-flash',
			't' =>'application/x-troff',			'tar' =>'application/x-tar',
			'tcl' =>'application/x-tcl',			'tex' =>'application/x-tex',
			'texi' =>'application/x-texinfo',		'texinfo' =>'application/x-texinfo',
			'tgz' =>'application/x-tar',			'tif' =>'image/tiff',
			'tiff' =>'image/tiff',					'tr' =>'application/x-troff',
			'tsv' =>'text/tab-separated-values',	'txt' =>'text/plain',
			'ustar' =>'application/x-ustar',		'vcd' =>'application/x-cdlink',
			'vrml' =>'model/vrml',					'vxml' =>'application/voicexml+xml',
			'wav' =>'audio/x-wav',					'wbmp' =>'image/vnd.wap.wbmp',
			'wbxml' =>'application/vnd.wap.wbxml',	'wml' =>'text/vnd.wap.wml',
			'wmlc' =>'application/vnd.wap.wmlc',	'wmlc' =>'application/vnd.wap.wmlc',
			'wmls' =>'text/vnd.wap.wmlscript',		'wmlsc' =>'application/vnd.wap.wmlscriptc',
			'wmlsc' =>'application/vnd.wap.wmlscriptc',	'wrl' =>'model/vrml',
			'xbm' =>'image/x-xbitmap',				'xht' =>'application/xhtml+xml',
			'xhtml' =>'application/xhtml+xml',		'xls' =>'application/vnd.ms-excel',
			'xml xsl' =>'application/xml',			'xpm' =>'image/x-xpixmap',
			'xslt' =>'application/xslt+xml',		'xul' =>'application/vnd.mozilla.xul+xml',
			'xwd' =>'image/x-xwindowdump',			'xyz' =>'chemical/x-xyz',
			'zip' =>'application/zip'
  );
  $ext = strtolower(pathinfo($filename,PATHINFO_EXTENSION));
  return isset($mime[$ext])?$mime[$ext]:'application/octet-stream';
 }
}
function send_file_to_download($path,$name = NULL)
{
 $fp = fopen($path,'rb');
 if (!$fp) {return FALSE;}
 ob_end_clean();
 ob_implicit_flush(1);
 $s = $size = $end = filesize($path);
 $start = 0;
 if (isset($_SERVER['HTTP_RANGE']))
 {
  header('HTTP/1.1 206 Partial Content');
  preg_match('~^bytes=(\d+)?\-(\d+)?$~',$_SERVER['HTTP_RANGE'],$m);
  if (isset($m[1])) {$start = $m[1]; fseek($fp,$m[1]); $s -= $m[1];}
  if (isset($m[2])) {$s -= $m[2]; $end = $m[2];}
 }
 header('Content-Disposition: attachment; filename='.($name !== NULL?$name:basename($path)));
 header('Last-Modified: '.date('D, d M Y H:i:s T',filemtime($path)));
 header('Accept-Ranges: bytes');
 header('Content-Length: '.$s);
 header('Content-Range: bytes '.$start.'-'.$end.'/'.$size);
 header('Content-type: '.mime_content_type($path));
 $g = 0;
 while (!feof($fp) and $fp)
 {
  $buf = fread($fp,4096);
  $g += strlen($buf);
  if ($g > $s) {$v = $g-$s; echo substr($buf,0,-1*$v); break;}
  else {echo $buf;}
 }
}
Учись, студент)

-~{}~ 06.01.07 12:39:

з.ы. извиняте за такой длинный код, коннект совсем плохой, долго искать куда залить.
 

hermit_refined

Отшельник
Автор оригинала: WP
PHP:
$s = $size = filesize($path);
// ...
preg_match('~^bytes=(\d+)?\-(\d+)?$~',$_SERVER['HTTP_RANGE'],$m);
if (isset($m[1])) {$start = $m[1]; fseek($fp,$m[1]); $s -= $m[1];}
if (isset($m[2])) {$s -= $m[2];}
// ...
header('Content-Length: '.$s);
header('Content-Range: bytes '.$start.'-'.$s.'/'.$size);
если это и работает, то по чистой случайности.
 

FedY@

Новичок
Автор оригинала: avm
1) Скорее всего на хостинге стоит "русский apache". В файле .htaccess впишите:
CharsetDisable On

2) ваш скрипт не увидит "mpeg", "mpv2" и "qt"...
не стоит у меня "русский апач"

-~{}~ 06.01.07 15:25:

Автор оригинала: hermit_refined
WP
см. 14.16 и 14.35 RFC 2616.
вопрос на засыпку - что такое $s ?..
PHP:
....
$s = $size = filesize($path); 
....
-~{}~ 06.01.07 15:29:

Автор оригинала: hermit_refined
если это и работает, то по чистой случайности.
ну так подскажи что там не так? или приведи пример! :(

-~{}~ 06.01.07 15:37:

;;;;;;;;;;;;;;;;;;;;;;
;Resource Limits;
;;;;;;;;;;;;;;;;;;;;;;

max_execution_time
max_input_time
memory_limit

что с этого может повлиять на работу скрипта? и сколько оптимально поставить? если макс файл может быть 2гига
 

FedY@

Новичок
Автор оригинала: themylogin
max_execution_time 0
max_input_time пох
memory_limit ХЗ скорее всего пох
ну у меня примерно так и стоит... 120 мин таймаута (execution), а всё остальное по стандарту!
 

WP

^_^
themylogin
Ты чего курил? Причем тут max_execution_time? memory лимит пох там же блоками читается.
 

FedY@

Новичок
WP
твоя функция вверху тоже не пашет.. точнее она работает но фильмы качает битыми!
 

hermit_refined

Отшельник
PHP:
....
$s = $size = filesize($path); 
....
не, меня интересует не это.
и вообще, FedY@, учитесь своими словами говорить, код я и сам вижу.
кто-нибудь из вас может объяснить эти два заголовка (и предыдущие магические вычитания):
PHP:
header('Content-Length: '.$s);
header('Content-Range: bytes '.$start.'-'.$s.'/'.$size);
(WP уже подправил свой код, но один баг остался)
ну так подскажи что там не так? или приведи пример!
типа вы хотите, чтобы я привел код, а вы его скопировали, не разбираясь? не-а.
во-первых, прочитайте описание протокола - RFC 2616
во-вторых, отлаживайте, пишите различную информацию в какой-нибудь лог, и смотрите, что там не так.
 

FedY@

Новичок
фак! случайно не в этом дело?

Content-Range: bytes 21010-47021/47022
Content-Length: 26012

тоесть выходит:

PHP:
header('Content-Length: '.$s); 
header('Content-Range: bytes '.$start.'-'.($s-1).'/'.$size);
или поправьте если что - то не так!=(

-~{}~ 06.01.07 20:42:

стоп $s же полный размер файла! как это можно сразу принять весь файл?:( он же должет отдавать кусками! я не прав?

может вот так:

PHP:
header('Content-Length: '.$s); 
 header('Content-Range: bytes '.$start.'-'.($end-1).'/'.$size);
-~{}~ 06.01.07 20:52:

вот попробывал... вот так работает:
PHP:
 header('Content-Length: '.$s); 
 header('Content-Range: bytes '.$start.'-'.($s-1).'/'.$size);
если не верно поправьте! пока что скачал 700мб... все работает и скачало до посл. байта... качаю 1.4гига

-~{}~ 06.01.07 21:02:

попробывал 1.4гига... и качал DownloadMaster'om
LightAlloy проигрует но не перемотует...
Классик перемотует и проигрует...
файл скачан от байта до байта...

если скачать не через скрипт - файл нормально отображаетсо в обоих проигрывателях...
 

DvR

Новичок
C:\Documents and Settings\user>fc /?
Сравнение двух файлов или двух наборов файлов
и вывод различий между ними.


FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W]
[/nnnn][диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2
FC /B [диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2

btw, SiMM.. краткость конечно сестра таланта, но в *nix тоже есть fc :) и это совсем не file compare.
 
Сверху