php下载文件相关资料 快来打我* 2022-07-12 07:57 175阅读 0赞 当下载文件需要与服务端交互时,就需要用脚本来实现,而不是单纯地链接到文件的地址 下载mp3文件的例子 <?php $file\_path = './data/upload/song/sample.mp3'; $file\_name = 'sample.mp3'; $file\_size = filesize($file\_path); header ( "Pragma: public" ); header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" ); header ( "Cache-Control: private", false ); header ( "Content-Transfer-Encoding: binary" ); header ( "Content-Type:audio/mpeg MP3"); header ( "Content-Length: " . $file\_size); header ( "Content-Disposition: attachment; filename=".$file\_name); echo(file\_get\_contents($file\_path)); exit; ?> 以下列表来自http://hi.baidu.com/zbzb /blog/item/643cd60021d25d11738b6530.html Content-type 的说明 'application/andrew-inset', 'hqx' => 'application/mac-binhex40', 'cpt' => 'application/mac-compactpro', 'doc' => 'application/msword', 'bin' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'lha' => 'application/octet-stream', 'lzh' => 'application/octet-stream', 'exe' => 'application/octet-stream', 'class' => 'application/octet-stream', 'so' => 'application/octet-stream', 'dll' => 'application/octet-stream', 'oda' => 'application/oda', 'pdf' => 'application/pdf', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'smi' => 'application/smil', 'smil' => 'application/smil', 'mif' => 'application/vnd.mif', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'wbxml' => 'application/vnd.wap.wbxml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'bcpio' => 'application/x-bcpio', 'vcd' => 'application/x-cdlink', 'pgn' => 'application/x-chess-pgn', 'cpio' => 'application/x-cpio', 'csh' => 'application/x-csh', 'dcr' => 'application/x-director', 'dir' => 'application/x-director', 'dxr' => 'application/x-director', 'dvi' => 'application/x-dvi', 'spl' => 'application/x-futuresplash', 'gtar' => 'application/x-gtar', 'hdf' => 'application/x-hdf', 'js' => 'application/x-javascript', 'skp' => 'application/x-koan', 'skd' => 'application/x-koan', 'skt' => 'application/x-koan', 'skm' => 'application/x-koan', 'latex' => 'application/x-latex', 'nc' => 'application/x-netcdf', 'cdf' => 'application/x-netcdf', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'swf' => 'application/x-shockwave-flash', 'sit' => 'application/x-stuffit', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'tar' => 'application/x-tar', 'tcl' => 'application/x-tcl', 'tex' => 'application/x-tex', 'texinfo' => 'application/x-texinfo', 'texi' => 'application/x-texinfo', 't' => 'application/x-troff', 'tr' => 'application/x-troff', 'roff' => 'application/x-troff', 'man' => 'application/x-troff-man', 'me' => 'application/x-troff-me', 'ms' => 'application/x-troff-ms', 'ustar' => 'application/x-ustar', 'src' => 'application/x-wais-source', 'xhtml' => 'application/xhtml+xml', 'xht' => 'application/xhtml+xml', 'zip' => 'application/zip', 'au' => 'audio/basic', 'snd' => 'audio/basic', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'kar' => 'audio/midi', 'mpga' => 'audio/mpeg', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'aif' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'm3u' => 'audio/x-mpegurl', 'ram' => 'audio/x-pn-realaudio', 'rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin', 'ra' => 'audio/x-realaudio', 'wav' => 'audio/x-wav', 'pdb' => 'chemical/x-pdb', 'xyz' => 'chemical/x-xyz', 'bmp' => 'image/bmp', 'gif' => 'image/gif', 'ief' => 'image/ief', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'djvu' => 'image/vnd.djvu', 'djv' => 'image/vnd.djvu', 'wbmp' => 'image/vnd.wap.wbmp', 'ras' => 'image/x-cmu-raster', 'pnm' => 'image/x-portable-anymap', 'pbm' => 'image/x-portable-bitmap', 'pgm' => 'image/x-portable-graymap', 'ppm' => 'image/x-portable-pixmap', 'rgb' => 'image/x-rgb', 'xbm' => 'image/x-xbitmap', 'xpm' => 'image/x-xpixmap', 'xwd' => 'image/x-xwindowdump', 'igs' => 'model/iges', 'iges' => 'model/iges', 'msh' => 'model/mesh', 'mesh' => 'model/mesh', 'silo' => 'model/mesh', 'wrl' => 'model/vrml', 'vrml' => 'model/vrml', 'css' => 'text/css', 'html' => 'text/html', 'htm' => 'text/html', 'asc' => 'text/plain', 'txt' => 'text/plain', 'rtx' => 'text/richtext', 'rtf' => 'text/rtf', 'sgml' => 'text/sgml', 'sgm' => 'text/sgml', 'tsv' => 'text/tab-separated-values', 'wml' => 'text/vnd.wap.wml', 'wmls' => 'text/vnd.wap.wmlscript', 'etx' => 'text/x-setext', 'xsl' => 'text/xml', 'xml' => 'text/xml', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'mxu' => 'video/vnd.mpegurl', 'avi' => 'video/x-msvideo', 'movie' => 'video/x-sgi-movie', 'ice' => 'x-conference/x-cooltalk', 以下列表来自http://snipplr.com/view /11452/mime-content-type/ <?php if(!function\_exists('mime\_content\_type')) \{ function mime\_content\_type($filename) \{ $mime\_types = array( 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', // images 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', // archives 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', // audio/video 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); $ext = strtolower(array\_pop(explode('.',$filename))); if (array\_key\_exists($ext, $mime\_types)) \{ return $mime\_types\[$ext\]; \} elseif (function\_exists('finfo\_open')) \{ $finfo = finfo\_open(FILEINFO\_MIME); $mimetype = finfo\_file($finfo, $filename); finfo\_close($finfo); return $mimetype; \} else \{ return 'application/octet-stream'; \} \} \} ?> 以下列表来自http://hi.baidu.com/5labs/blog/item/3a094bc2fabec55eb319a8b9.html 1.获取远程文件大小及信息的函数 <?php //取文件大小函数中 function getFileSize($url)\{ //返回一个数组,包含scheme,host,port,path之类的信息 $url = parse\_url($url); if($fp = @fsockopen($url\['host'\],empty($url\['port'\])?80:$url\['port'\],$error))\{ fputs($fp,"GET ".(empty($url\['path'\])?'/':$url\['path'\])." HTTP/1.1/r/n"); fputs($fp,"Host:$url\[host\]/r/n/r/n"); while(!feof($fp))\{ $tmp = fgets($fp); if(trim($tmp) == '')\{ break; \}else if(preg\_match('/Content-Length:(.\*)/si',$tmp,$arr))\{ return trim($arr\[1\]); \} \} return null; \}else\{ return null; \} \} echo getFileSize("http://www.dianpub.com/download/xml.rar") ?> 2.图片 //记录程序开始的时间 $BeginTime=getmicrotime(); function GrabImage($url,$filename="") \{ if($url==""):return false;endif; if($filename=="") \{ $ext=strrchr($url,"."); if($ext!=".gif" && $ext!=".jpg"):return false;endif; $filename=date("dMYHis").$ext; \} ob\_start(); readfile($url); $img = ob\_get\_contents(); ob\_end\_clean(); $size = strlen($img); $fp2=@fopen($filename, "a"); fwrite($fp2,$img); fclose($fp2); return $filename; \} $img=GrabImage("http://www.dianpub.com/images/\_1978837\_detector\_ap100.jpg",""); if($img):echo '<pre><img src="'.$img.'"></pre>';else:echo "false";endif; //记录程序运行结束的时间 $EndTime=getmicrotime(); //返回运行时间 exit($EndTime-$BeginTime); 3.全文下载图片 if(!empty($saveremoteimg)) \{ $body = stripslashes($body); $img\_array = array(); preg\_match\_all("/(src|SRC)=\[/"|'| \]\{0,\}(http:(.\*)/.(gif|jpg|jpeg|bmp|png))/isU",$body,$img\_array); $img\_array = array\_unique($img\_array\[2\]); set\_time\_limit(0); $imgUrl = $img\_dir."/".strftime("%Y%m%d",time()); $imgPath = $base\_dir.$imgUrl; $milliSecond = strftime("%H%M%S",time()); if(!is\_dir($imgPath)) @mkdir($imgPath,0777); foreach($img\_array as $key =>$value) \{ $value = trim($value); $get\_file = @file\_get\_contents($value); $rndFileName = $imgPath."/".$milliSecond.$key.".".substr($value,-3,3); $fileurl = $imgUrl."/".$milliSecond.$key.".".substr($value,-3,3); if($get\_file) \{ $fp = @fopen($rndFileName,"w"); @fwrite($fp,$get\_file); @fclose($fp); \} $body = ereg\_replace($value,$fileurl,$body); \} $body = addslashes($body); \} 4.PHP远程文件下载类(支持断点续传) 1).功能:支持断点续传的下载,能计算传输率,能控制传输率 简易使用方法: $object = new httpdownload(); $object->set\_byfile($file);//服务器文件名,包括路径 $object->filename = $filename;//下载另存为的文件名 $object->download(); 类文件: <? class httpdownload \{ var $data = null; var $data\_len = 0; var $data\_mod = 0; var $data\_type = 0; var $data\_section = 0; //section download var $sentSize=0; var $handler = array('auth' => null); var $use\_resume = true; var $use\_autoexit = false; var $use\_auth = false; var $filename = null; var $mime = null; var $bufsize = 2048; var $seek\_start = 0; var $seek\_end = -1; var $totalsizeref = 0; var $bandwidth = 0; var $speed = 0; function initialize() \{ global $HTTP\_SERVER\_VARS; if ($this->use\_auth) //use authentication \{ if (!$this->\_auth()) //no authentication \{ header('WWW-Authenticate: Basic realm="Please enter your username and password"'); header('HTTP/1.0 401 Unauthorized'); header('status: 401 Unauthorized'); if ($this->use\_autoexit) exit(); return false; \} \} if ($this->mime == null) $this->mime = "application/octet-stream"; //default mime if (isset($\_SERVER\['HTTP\_RANGE'\]) || isset($HTTP\_SERVER\_VARS\['HTTP\_RANGE'\])) \{ if (isset($HTTP\_SERVER\_VARS\['HTTP\_RANGE'\])) $seek\_range = substr($HTTP\_SERVER\_VARS\['HTTP\_RANGE'\] , strlen('bytes=')); else $seek\_range = substr($\_SERVER\['HTTP\_RANGE'\] , strlen('bytes=')); $range = explode('-',$seek\_range); if ($range\[0\] > 0) \{ $this->seek\_start = intval($range\[0\]); \} if ($range\[1\] > 0) $this->seek\_end = intval($range\[1\]); else $this->seek\_end = -1; if (!$this->use\_resume) \{ $this->seek\_start = 0; //header("HTTP/1.0 404 Bad Request"); //header("Status: 400 Bad Request"); //exit; //return false; \} else \{ $this->data\_section = 1; \} \} else \{ $this->seek\_start = 0; $this->seek\_end = -1; \} $this->sentSize=0; return true; \} function header($size,$seek\_start=null,$seek\_end=null) \{ header('Content-type: ' . $this->mime); header('Content-Disposition: attachment; filename="' . $this->filename . '"'); header('Last-Modified: ' . date('D, d M Y H:i:s /G/M/T' , $this->data\_mod)); if ($this->data\_section && $this->use\_resume) \{ header("HTTP/1.0 206 Partial Content"); header("Status: 206 Partial Content"); header('Accept-Ranges: bytes'); header("Content-Range: bytes $seek\_start-$seek\_end/$size"); header("Content-Length: " . ($seek\_end - $seek\_start + 1)); \} else \{ header("Content-Length: $size"); \} \} function download\_ex($size) \{ if (!$this->initialize()) return false; ignore\_user\_abort(true); //Use seek end here if ($this->seek\_start > ($size - 1)) $this->seek\_start = 0; if ($this->seek\_end <= 0) $this->seek\_end = $size - 1; $this->header($size,$seek,$this->seek\_end); $this->data\_mod = time(); return true; \} function download() \{ if (!$this->initialize()) return false; try \{ error\_log("begin download/n", 3,"/usr/local/www/apache22/LOGS/apache22\_php.err"); $seek = $this->seek\_start; $speed = $this->speed; $bufsize = $this->bufsize; $packet = 1; //do some clean up @ob\_end\_clean(); $old\_status = ignore\_user\_abort(true); @set\_time\_limit(0); $this->bandwidth = 0; $size = $this->data\_len; if ($this->data\_type == 0) //download from a file \{ $size = filesize($this->data); if ($seek > ($size - 1)) $seek = 0; if ($this->filename == null) $this->filename = basename($this->data); $res = fopen($this->data,'rb'); if ($seek) fseek($res , $seek); if ($this->seek\_end < $seek) $this->seek\_end = $size - 1; $this->header($size,$seek,$this->seek\_end); //always use the last seek $size = $this->seek\_end - $seek + 1; while (!(connection\_aborted() || connection\_status() == 1) && $size > 0) \{ if ($size < $bufsize) \{ echo fread($res , $size); $this->bandwidth += $size; $this->sentSize+=$size; \} else \{ echo fread($res , $bufsize); $this->bandwidth += $bufsize; $this->sentSize+=$bufsize; \} $size -= $bufsize; flush(); if ($speed > 0 && ($this->bandwidth > $speed\*$packet\*1024)) \{ sleep(1); $packet++; \} \} fclose($res); \} elseif ($this->data\_type == 1) //download from a string \{ if ($seek > ($size - 1)) $seek = 0; if ($this->seek\_end < $seek) $this->seek\_end = $this->data\_len - 1; $this->data = substr($this->data , $seek , $this->seek\_end - $seek + 1); if ($this->filename == null) $this->filename = time(); $size = strlen($this->data); $this->header($this->data\_len,$seek,$this->seek\_end); while (!connection\_aborted() && $size > 0) \{ if ($size < $bufsize) \{ $this->bandwidth += $size; $this->sentSize+=$size; \} else \{ $this->bandwidth += $bufsize; $this->sentSize+=$bufsize; \} echo substr($this->data , 0 , $bufsize); $this->data = substr($this->data , $bufsize); $size -= $bufsize; flush(); if ($speed > 0 && ($this->bandwidth > $speed\*$packet\*1024)) \{ sleep(1); $packet++; \} \} \} else if ($this->data\_type == 2) \{ //just send a redirect header header('location: ' . $this->data); \} if($this->totalsizeref==$this->sentSize )error\_log("end download/n", 3,"/usr/local/www/apache22/LOGS/apache22\_php.err"); else error\_log("download is canceled/n", 3,"/usr/local/www/apache22/LOGS/apache22\_php.err"); if ($this->use\_autoexit) exit(); //restore old status ignore\_user\_abort($old\_status); set\_time\_limit(ini\_get("max\_execution\_time")); \} catch(Exception $e) \{ error\_log("cancel download/n".$e, 3,"/usr/local/www/apache22/LOGS/apache22\_php.err"); \} return true; \} function set\_byfile($dir) \{ if (is\_readable($dir) && is\_file($dir)) \{ $this->data\_len = 0; $this->data = $dir; $this->data\_type = 0; $this->data\_mod = filemtime($dir); $this->totalsizeref = filesize($dir); return true; \} else return false; \} function set\_bydata($data) \{ if ($data == '') return false; $this->data = $data; $this->data\_len = strlen($data); $this->data\_type = 1; $this->data\_mod = time(); return true; \} function set\_byurl($data) \{ $this->data = $data; $this->data\_len = 0; $this->data\_type = 2; return true; \} function set\_lastmodtime($time) \{ $time = intval($time); if ($time <= 0) $time = time(); $this->data\_mod = $time; \} function \_auth() \{ if (!isset($\_SERVER\['PHP\_AUTH\_USER'\])) return false; if (isset($this->handler\['auth'\]) && function\_exists($this->handler\['auth'\])) \{ return $this->handler\['auth'\]('auth' , $\_SERVER\['PHP\_AUTH\_USER'\],$\_SERVER\['PHP\_AUTH\_PW'\]); \} else return true; //you must use a handler \} \} ?> 5. php 使用GD库下载远程图片 <?php $imgname = "http://imgdujia.kuxun.cn/newpic/929/812929/4.jpg"; $src\_im = imagecreatefromjpeg($imgname); $srcW = ImageSX($src\_im); //获得图像的宽 $srcH = ImageSY($src\_im); //获得图像的高 $dst\_im = ImageCreateTrueColor($srcW,$srcH); //创建新的图像对象 imagecopy($dst\_im, $src\_im, 0, 0, 0, 0, $srcW, $srcH); imagejpeg($dst\_im, "newpic.jpg"); //创建缩略图文件 echo "<img src="newpic.jpg" mce\_src="newpic.jpg"></img>"; ?> <?php header("Content-type: image/png"); $im = imagecreatefromjpeg("http://postimg.mop.com/200602/02/74/122374/200602022335325121.JPG"); $white = imagecolorallocate($im, 0xF9, 0xD7, 0xCD); imagefill($im, 0, 0,$white); $text\_color = imagecolorallocate($im, 233, 14, 91); imagestring($im, 1, 5, 5, "A Simple Text String", $text\_color); imagepng($im); imagedestroy($im); ?> 注意这个要把PHP分配内存调大,应用时用大内存服务器
还没有评论,来说两句吧...