欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

some useful php function 2

程序员文章站 2022-05-08 19:43:37
...

断点续传

<?php
	function sendfile($myFile){ 
		$mm_type="application/octet-stream"; 
		$fp = fopen($myFile,'rb'); 
		$size = filesize($myFile); 
		ob_start(); 
		header("Cache-Control: public, must-revalidate"); 
		header("Pragma: hack"); 
		header("Content-Type: " . $mm_type); 
		header('Content-Disposition: attachment; filename="'.$fname.'"'); 
		header("Content-Transfer-Encoding: binaryn");  
		if (isset($_SERVER['HTTP_RANGE']) && ($_SERVER['HTTP_RANGE'] != "") && preg_match("/^bytes=([0-9]+)-/i", $_SERVER['HTTP_RANGE'], $match) && ($match[1] < $size)) { 
			$range = $match[1]; 
			fseek($fp, $range); 
			header("HTTP/1.1 206 Partial Content"); 
			//header("Date: " . gmdate("D, d M Y H:i:s") . " GMT"); 
			header("Last-Modified: ".gmdate("D, d M Y H:i:s", filemtime($myFile))." GMT"); 
			header("Accept-Ranges: bytes"); 
			$rangesize = ($size - $range) > 0 ? ($size - $range) : 0; 
			header("Content-Length:".$rangesize); 
			header("Content-Range: bytes ".$range.'-'.($size-1)."/".$size); 
			//header("Connection: close"." ");  
		}else{ 
			header("Content-Length: ".(string)($size)); 
			header("Accept-Ranges: bytes"); 
			$range = 0; 
		}  
		fpassthru($fp); 
		ob_end_flush();  
	}
?>

 裁减图片

<? 
	$FILENAME="test.jpg; 
	// 生成图片的宽度 
	$RESIZEWIDTH=400; 
	// 生成图片的高度 
	$RESIZEHEIGHT=400; 

	function ResizeImage($im,$maxwidth,$maxheight,$name){ 
		$width = imagesx($im); 
		$height = imagesy($im); 
		if(($maxwidth && $width > $maxwidth) || ($maxheight && $height > $maxheight)){ 
			if($maxwidth && $width > $maxwidth){ 
				$widthratio = $maxwidth/$width; 
				$RESIZEWIDTH=true; 
			} 
			if($maxheight && $height > $maxheight){ 
				$heightratio = $maxheight/$height; 
				$RESIZEHEIGHT=true; 
			} 
			if($RESIZEWIDTH && $RESIZEHEIGHT){ 
				if($widthratio < $heightratio){ 
					$ratio = $widthratio; 
				}else{ 
					$ratio = $heightratio; 
				} 
			}elseif($RESIZEWIDTH){ 
				$ratio = $widthratio; 
			}elseif($RESIZEHEIGHT){ 
				$ratio = $heightratio; 
			} 
			$newwidth = $width * $ratio; 
			$newheight = $height * $ratio; 
			if(function_exists("imagecopyresampled")){ 
				$newim = imagecreatetruecolor($newwidth, $newheight); 
				imagecopyresampled($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 
			}else{ 
				$newim = imagecreate($newwidth, $newheight); 
				imagecopyresized($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); 
			} 
			ImageJpeg ($newim,$name . ".jpg"); 
			ImageDestroy ($newim); 
		}else{ 
			ImageJpeg ($im,$name . ".jpg"); 
		} 
	} 
if($_FILES['image']['size']){ 
	if($_FILES['image']['type'] == "image/pjpeg"){ 
		$im = imagecreatefromjpeg($_FILES['image']['tmp_name']); 
	}elseif($_FILES['image']['type'] == "image/x-png"){ 
		$im = imagecreatefrompng($_FILES['image']['tmp_name']); 
	}elseif($_FILES['image']['type'] == "image/gif"){ 
		$im = imagecreatefromgif($_FILES['image']['tmp_name']); 
	} 
	if($im){ 
		if(file_exists("$FILENAME.jpg")){ 
			unlink("$FILENAME.jpg"); 
		} 
		ResizeImage($im,$RESIZEWIDTH,$RESIZEHEIGHT,$FILENAME); 
		ImageDestroy ($im); 
	} 
} 

 压缩文件

<?php
set_time_limit(0);
class phpzip{
    var $file_count = 0 ;
    var $datastr_len   = 0;
    var $dirstr_len = 0;
    var $filedata = ''; //该变量只被类外部程序访问
    var $gzfilename;
    var $fp;
    var $dirstr='';
    /*
    返回文件的修改时间格式.
    只为本类内部函数调用.
    */
    function unix2dostime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
        if ($timearray['year'] < 1980) {
        $timearray['year']    = 1980;
        $timearray['mon']     = 1;
        $timearray['mday']    = 1;
        $timearray['hours']   = 0;
        $timearray['minutes'] = 0;
        $timearray['seconds'] = 0;
        }
        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
               ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
    }
    /*
    初始化文件,建立文件目录,
    并返回文件的写入权限.
    */
    function startfile($path = 'faisun.zip'){
       $this->gzfilename=$path;
       $mypathdir=array();
       do{
        $mypathdir[] = $path = dirname($path);
       }while($path != '.');
       @end($mypathdir);
       do{
        $path = @current($mypathdir);
        @mkdir($path);
       }while(@prev($mypathdir));
 
       if($this->[email protected]($this->gzfilename,"w")){
        return true;
       }
       return false;
    }
    /*
    添加一个文件到 zip 压缩包中.
    */
    function addfile($data, $name){
        $name     = str_replace('\', '/', $name);
        if(strrchr($name,'/')=='/') return $this->adddir($name);
        $dtime    = dechex($this->unix2dostime());
        $hexdtime = 'x' . $dtime[6] . $dtime[7]
                  . 'x' . $dtime[4] . $dtime[5]
                  . 'x' . $dtime[2] . $dtime[3]
                  . 'x' . $dtime[0] . $dtime[1];
        eval('$hexdtime = "' . $hexdtime . '";');
        $unc_len = strlen($data);
        $crc     = crc32($data);
        $zdata   = gzcompress($data);
        $c_len   = strlen($zdata);
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
    //新添文件内容格式化:
        $datastr = "x50x4bx03x04";
        $datastr .= "x14x00";            // ver needed to extract
        $datastr .= "x00x00";            // gen purpose bit flag
        $datastr .= "x08x00";            // compression method
        $datastr .= $hexdtime;             // last mod time and date
        $datastr .= pack('v', $crc);             // crc32
        $datastr .= pack('v', $c_len);           // compressed filesize
        $datastr .= pack('v', $unc_len);         // uncompressed filesize
        $datastr .= pack('v', strlen($name));    // length of filename
        $datastr .= pack('v', 0);                // extra field length
        $datastr .= $name;
        $datastr .= $zdata;
        $datastr .= pack('v', $crc);                 // crc32
        $datastr .= pack('v', $c_len);               // compressed filesize
        $datastr .= pack('v', $unc_len);             // uncompressed filesize

    fwrite($this->fp,$datastr); //写入新的文件内容
    $my_datastr_len = strlen($datastr);
    unset($datastr);
 
    //新添文件目录信息
        $dirstr = "x50x4bx01x02";
        $dirstr .= "x00x00";                // version made by
        $dirstr .= "x14x00";                // version needed to extract
        $dirstr .= "x00x00";                // gen purpose bit flag
        $dirstr .= "x08x00";                // compression method
        $dirstr .= $hexdtime;                 // last mod time & date
        $dirstr .= pack('v', $crc);           // crc32
        $dirstr .= pack('v', $c_len);         // compressed filesize
        $dirstr .= pack('v', $unc_len);       // uncompressed filesize
        $dirstr .= pack('v', strlen($name) ); // length of filename
        $dirstr .= pack('v', 0 );             // extra field length
        $dirstr .= pack('v', 0 );             // file comment length
        $dirstr .= pack('v', 0 );             // disk number start
        $dirstr .= pack('v', 0 );             // internal file attributes
        $dirstr .= pack('v', 32 );            // external file attributes - 'archive' bit set
        $dirstr .= pack('v',$this->datastr_len ); // relative offset of local header
        $dirstr .= $name;
    $this->dirstr .= $dirstr; //目录信息
    $this -> file_count ++;
    $this -> dirstr_len += strlen($dirstr);
    $this -> datastr_len += $my_datastr_len;
    }
    function adddir($name){
       $name = str_replace("\", "/", $name);
       $datastr = "x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00";
       $datastr .= pack("v",0).pack("v",0).pack("v",0).pack("v", strlen($name) );
       $datastr .= pack("v", 0 ).$name.pack("v", 0).pack("v", 0).pack("v", 0);
       fwrite($this->fp,$datastr); //写入新的文件内容
       $my_datastr_len = strlen($datastr);
       unset($datastr);
       $dirstr = "x50x4bx01x02x00x00x0ax00x00x00x00x00x00x00x00x00";
       $dirstr .= pack("v",0).pack("v",0).pack("v",0).pack("v", strlen($name) );
       $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );
       $dirstr .= pack("v", 16 ).pack("v",$this->datastr_len).$name;
       $this->dirstr .= $dirstr; //目录信息
       $this -> file_count ++;
       $this -> dirstr_len += strlen($dirstr);
       $this -> datastr_len += $my_datastr_len;
    }
    function createfile(){
       //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息
       $endstr = "x50x4bx05x06x00x00x00x00" .
          pack('v', $this -> file_count) .
          pack('v', $this -> file_count) .
          pack('v', $this -> dirstr_len) .
          pack('v', $this -> datastr_len) .
          "x00x00";
       fwrite($this->fp,$this->dirstr.$endstr);
       fclose($this->fp);
    }
}
?>