本文实例汇报了PHP使用finfo_file()函数检查评定上传图片类型的兑现情势。分享给大家供我们参谋,具体如下:

PHP图片上传类,优良格局,可是上传功能还算能够,笔者自身用过的四个类,当时对这些类做了些修改,以满足自个儿一定成效的急需,对PHP精通的,可对那几个上传类做优化和修改,后附有调用方法,让PHP开采者上传图片轻易轻易就完事,先上类代码:

//文件上传。Linux+apache+php3/4测验通过。iis测量试验未经过,win+apache+php未测验  
<?php  
if ($HTTP_POST_VARS[“upload”]==”上传”){  
file://这里你能够增加检查文件名,格式,图片尺寸等效率,  
file://$picurl 本地系统的全路线  
file://$picurl_函数检测上传图片类型的实现方法,PHP实现原生态图片上传封装类方法。name 上传后的一时文件名  
file://$picurl_size 文件的尺寸(字节)  
file://$picurl_type 文件的MIME类型  

本文所述为一个实用的PHP多图片文件上传类,其匡助gif、jpg、jpeg、pjpeg、png格式的多图片上传成效,类中还可限制图片类型、上传图片的深浅、设置上传目录、一些交付剖断等功能。另外该类并不囿于于图片的上传,也能够上传TXT/RA卡宴等文件类型,只是须要对代码进行一下改造,感兴趣的读者可以团结尝试一下。

在输入输出中,文件的相互不能缺少,比如文件的上传什么的。这里大家来减轻三个小意思,正是怎么样判断用户上传文件的文件类型。

<?php
class FileUpload_Single
{
//user define -------------------------------------
var $accessPath ;
var $fileSize=200;
var $defineTypeList="jpg|jpeg|gif|bmp";//string jpg|gif|bmp ...
var $filePrefix= "useruplod_";//上传后的文件名前缀,可设置为空
var $changNameMode;//图片改名的规则,暂时只有三类,值范围 : 0 至 2 任一值
var $uploadFile;//array upload file attribute
var $newFileName;
var $error;

function TODO()
{//main 主类:设好参数,可以直接调用
$pass = true ;

if ( ! $this -> GetFileAttri() )

{
  $pass = false;

}

if( ! $this -> CheckFileMIMEType() )

 {

 $pass = false;

 $this -> error .= die("<script language=\"javascript\">alert('图片类型不正确,允许格式:jpg|jpeg|gif|bmp。');history.back()</script>");

}

if( ! $this -> CheckFileAttri_size() )

{
  $pass = false;

  $this -> error .= die("<script language=\"javascript\">alert('上传的文件太大,请确保在200K以内。');history.back()</script>");

  return false;

}

if ( ! $this -> MoveFileToNewPath() )

{
  $pass = false;
  $this -> error .= die("<script language=\"javascript\">alert('上传失败!文件移动发生错误!');history.back()</script>");
} 

 return $pass;

}

function GetFileAttri()

{

 foreach( $_FILES as $tmp )

 {

  $this -> uploadFile = $tmp;

 }

 return (empty( $this -> uploadFile[ 'name' ])) ? false : true;

}
function CheckFileAttri_size()
{
 if ( ! empty ( $this -> fileSize ))
 {
  if ( is_numeric( $this -> fileSize ))
  {
  if ($this -> fileSize > 0)
  {
   return ($this -> uploadFile[ 'size' ] > $this -> fileSize * 1024) ? false : true ;
  } 
  }
  else
  {
  return false;

  }

 }

 else

 {

  return false;

 }

 }

 function ChangeFileName ($prefix = NULL , $mode)

 {// string $prefix , int $mode

 $fullName = (isset($prefix)) ? $prefix."_" : NULL ;

 switch ($mode)

 {

  case 0  : $fullName .= rand( 0 , 100 ). "_" .strtolower(date ("ldSfFYhisa")) ; break;

  case 1  : $fullName .= rand( 0 , 100 ). "_" .time(); break;

  case 2  : $fullName .= rand( 0 , 10000 ) . time();  break;

  default : $fullName .= rand( 0 , 10000 ) . time();  break;

 }

 return $fullName;

 }

 function MoveFileToNewPath()

 {

 $newFileName = NULL;

 $newFileName = $this -> ChangeFileName( $this -> filePrefix , 2 ). "." . $this -> GetFileTypeToString();

 //检查目录是否存在,不存在则创建,当时我用的时候添加了这个功能,觉得没用的就注释掉吧

 /*

 $isFile = file_exists( $this -> accessPath);

 clearstatcache();

  if( ! $isFile && !is_dir($this -> accessPath) )

  {

    echo $this -> accessPath;

  @mkdir($this -> accessPath);

  }*/

$array_dir=explode("/",$this -> accessPath);//把多级目录分别放到数组中

 for($i=0;$i<count($array_dir);$i++){

 $path .= $array_dir[$i]."/";

 if(!file_exists($path)){

  mkdir($path);

 }

 }

/////////////////////////////////////////////////////////////////////////////////////////////////

  if ( move_uploaded_file( $this -> uploadFile[ 'tmp_name' ] , realpath( $this -> accessPath ) . "/" .$newFileName ) )
  {
    $this -> newFileName = $newFileName;
      return true;
  }else{
    return false;
  }
/////////////////////////////////////////////////////////////////////////////////////////////////
}
function CheckFileExist( $path = NULL)
 {
 return ($path == NULL) ? false : ((file_exists($path)) ? true : false);
 }
function GetFileMIME()
 {
 return $this->GetFileTypeToString();
 }
function CheckFileMIMEType()
 {
 $pass = false;
 $defineTypeList = strtolower( $this ->defineTypeList);
 $MIME = strtolower( $this -> GetFileMIME());
 if (!empty ($defineTypeList))
 {
  if (!empty ($MIME))
  {
  foreach(explode("|",$defineTypeList) as $tmp)
  {
   if ($tmp == $MIME)
   {
   $pass = true;
   }
  }
  }
  else
  {
  return false;
  }   
  }
  else
  {
  return false;
  }

  return $pass;

 }

 function GetFileTypeToString()

 {

 if( ! empty( $this -> uploadFile[ 'name' ] ) )
 {
  return substr( strtolower( $this -> uploadFile[ 'name' ] ) , strlen( $this -> uploadFile[ 'name' ] ) - 3 , 3 ); 
 }
 }
}

?>

copy(“$picurl”,”/where/you/want/put/the/uploaded/files/in/$picurl_name”);  
exit;  
}  
?>  
<form action=”.” method=”post” enctype=”multipart/form-data”
name=”UL”>  
<!–注意:这里不可不抬高‘enctype=”multipart/form-data”
‘,不然不会发出上  
传动作–>  
<input type=”file” name=”picurl” size=”15″  
accept=”image/x-png,image/gif,image/jpeg”>  
<input type=”submit” name=”upload” value=”上传”>  
</form> 

php多图片上传类完整意义代码如下:

举一个选择场合:在大家的Web应用中,比方用户上传头像,要求是png,jpg,gif格式,接收到图片后会依据图片格式类型做差别的头像切割管理,但各自用户会传一些只变动过文件后缀的非规范图片,举例nowamagic.jpg
强行修改成
nowamagic.png,那样程序相当的小概对该品种图片举行切割,切割战败。这年就须求对文本进行检查测试,何况只是根据后缀来决断是极其的。

以下是PHP上传类的调用方法,PHP代码如下:

<?php
class more_file_upload{
  const FILE_PATH = '/uploadfile/'; //默认文件上传的目录,请自行修改
  var file_type;
  var file_type_array;
  var file_type_real_array;
  var file_type_string;
  var file_name;
  var file_size;
  var file_tmp_name;
  var file_error;
  var handledate;
  static totalsize = 0;
  function __construct(file_name, file_error, file_size, file_tmp_name, file_type){
    this -> handledate = date('m-d-Y');
    if (!empty(file_name)){
      this -> file_name = file_name;
      this -> file_error = file_error;
      this -> file_size = file_size;
      this -> file_tmp_name = file_tmp_name;
      this -> file_type = file_type;
      this -> file_type_array = array('/', 'image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png');
      this -> file_type_real_array = array(0.1, 'jpg' => 74707370, 'gif' => 7173, 'bmp' => 6677, 'png' => 807871);
      this -> show_execute_message(this -> file_error, this -> file_name, this -> file_type, this -> file_size);
      }
    }
  function __destruct(){
    this -> file_name = NULL;
    this -> file_error = NULL;
    this -> file_size = NULL;
    this -> file_tmp_name = NULL;
    this -> file_type = NULL;
    self :: totalsize = 0;
    }
  function show_execute_message(smfileerror, smfilename, smfiletype, smfilesize){
    if(smfileerror > 0){
      switch (smfileerror){
      case 1: smfilemessage = '<strong>文件超过服务器的约定大小!</strong>';
        break;
      case 2: smfilemessage = '<strong>文件超过指定的文件大小!</strong>';
        break;
      case 3: smfilemessage = '<strong>文件只上传了部分!</strong>';
        break;
      case 4: echo "this->file_name " . '文件上传失败!<br/>';
        break;
        }
      self :: __destruct();
      }else{
      smfiletypeflag = array_search(smfiletype, this -> file_type_array);
      // 进行真实格式验证
      if(smfiletypeflag != false){
        file = fopen(this -> file_tmp_name, "rb");
        bin = fread(file, 10);
        fclose(file);
        strInfo = @unpack("c10chars", bin);
        typeCode = intval(strInfo['chars1'] . strInfo['chars2']);
        smfiletypeflag = array_search(typeCode, this -> file_type_real_array);
        if(smfiletypeflag == false){ // 判断是否是png图片
          typeCode = intval(strInfo['chars2'] . strInfo['chars3'] . strInfo['chars4']);
          smfiletypeflag = array_search(typeCode, this -> file_type_real_array);
          if(smfiletypeflag == false){ // 判断是否是jpg图片
            $typeCode = intval(strInfo['chars7'] . strInfo['chars8'] . strInfo['chars9'] . strInfo['chars10']);
            smfiletypeflag = array_search(typeCode, this -> file_type_real_array);
            }
          }
        }
      if($smfiletypeflag == false){
        $smfilemessage = '<strong>文件类型不对,请核实!</strong>';
        self :: __destruct();
        }else{
        $resflag = $this -> move_file($this -> file_tmp_name, this -> file_name);
        if (resflag == 1){
          $smfilemessage = '文件上传成功!';
          self :: totalsize += intval($smfilesize);
          self :: __destruct();
          }else{
          $smfilemessage = '<strong>文件上传失败!</strong>';
          self :: __destruct();
          }
        }
      }
    $smfilesizeformat = $this -> size_BKM(smfilesize);
    echo '<tr>
<td align="left" >' . smfilename . '</td>
<td align="center" >' . smfiletype . '</td>
<td align="center" >' . smfilesizeformat . '</td>
<td align="center" >' . smfilemessage . '</td>
</tr>';
    }
  function move_file(mvfiletmp, mvfilename){ // 移动文件
    mvfilenamearr = explode('.', basename(mvfilename));
    mvfilenamearr[0] = this -> rand_string();
    mvfilename = implode('.', mvfilenamearr);
    if (is_uploaded_file(mvfiletmp)){
      uploadfile = self :: FILE_PATH . "mvfilename";
      result = move_uploaded_file(mvfiletmp, uploadfile);
      return result;
      }
    }
  function rand_string(){
    string = md5(uniqid(rand() . microtime()));
    return string;
    }
  function size_BKM(size){ // B/KB/MB单位转换
    if(size < 1024)
    {
      size_BKM = (string)size . " B";
      }
    elseif(size < (1024 * 1024))
      {
      size_BKM = number_format((double)(size / 1024), 1) . " KB";
      }else
      {
      size_BKM = number_format((double)(size / (1024 * 1024)), 1) . " MB";
      }
    return size_BKM;
    }
  }
?>

这种这么普及的急需,PHP确定自带了有些函数来落到实处的,那个函数正是
finfo_file

 <?php
include 'up.class.php';//加载PHP上传类文件
if (empty($HTTP_POST_FILES['image_file']['tmp_name']))//判断接收数据是否为空
{

    $tmp = new FileUpload_Single;

    $tmp -> accessPath ='upload';//图片上传的目录,这里是当前目录下的upload目录,可自己修改

    if ( $tmp -> TODO() )

    {
      $filename=$tmp -> newFileName;//生成的文件名
      echo "图片上传成功,路径为:upload/".$filename;
    }else{
      echo $tmp -> error;
    }     
}
else{
  echo "没有图片数据可上传";
}
?>

读者能够将上述代码复制到PHP文件中,并保存文件名叫:more_upload_file.class.php,在采用时include该公文就能够。

网站地图xml地图