php下载文件相关资料

当下载文件需要与服务端交互时,就需要用脚本来实现,而不是单纯地链接到文件的地址

下载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分配内存调大,应用时用大内存服务器

你可能感兴趣的:(PHP,function,server,header,File,download)