七空幻音LOGO

七空幻音

PHP简单文件上传2016-05-17 18:12:57

之前我记得写过一个图片上传的文章,但是图片和文件区别也是很大的,文件必须保证上传的类型必须符合要求,否则将会导致网站异常,攻击等,比如你没有判断别人上传的文件类型,那别人直接上传一个php的木马,直接放一个webshell在你的网站,遍历目录,获取你的网站源代码等等。

所以对于文件上传的要求是很高的。接下来我讲述一个简单的文件上传方法。

我在这里允许上传的后缀为 txt、zip、rar这三种文件类型。

最大上传大小为2024kb(2M),php.ini配置文件中默认就是2m

做文件上传一般都是判断文件是否存在,文件保存目录是否存在,文件上传目录是否有权限,文件是否超过最大大小限制,是否是通过https方式上传,文件上传后缀(类型)是否被允许这几种常规上传规则。

首先html我们使用框架上传,这样更好一点,php是没法异步上传的,框架上传也是一种不错的方法。


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>【七空幻音】PHP简单文件上传</title>
  </head>
  <body>
    <form action="file.php" method="post" enctype="multipart/form-data" target="upfile_iframe">
      <input type="submit" name="submit" value="上传">
    </form>
    <iframe src="file.php" width="0" height="0" style="display:none;" name="upfile_iframe"></iframe>
  </body>
</html>

  php上传的要求是post方法,enctype="multipart/form-data" 属性。

为了方便上传再加上一个框架,让上传图片在这个框架上传,所以给表单加上一个target指向这个框架就行了。框架再隐藏即可。

上传处理文件


<?php
//文件上传 txt rar zip
header("Content-type: text/html; charset=utf-8");
//允许的文件类型
$allowSuffix = array('txt','rar','zip');
//最大上传大小(KB)
$sizeMax = 2024;
if(isset($_FILES['upfile'])){
    $file = $_FILES['upfile'];
    $size = $file['size'];
    $name = $file['name'];
    $error = $file['error'];
    //判断文件是否上传
    if(!$name){
      alert("请选择文件");
    }
    //判断这个目录是否存在
    if(!is_dir("upload")){
      alert("文件保存目录不存在");
    }
    //判断是否有这个目录写的权限
    if (@is_writable("upload") === false) {
      alert("上传目录没有写权限");
    }
    if($size/1024>$sizeMax){
      alert("文件大小超过最大限制");
    }
    if(!is_uploaded_file($_FILES['upfile']['tmp_name'])) {
      alert("上传失败");
    }
    //检查是否运行这个后缀的上传
    if(!in_array(get_suffix($name),$allowSuffix)){
        alert("这个类型不允许上传");
    }
    $filePath = "upload/".file_rename($name);
    if(move_uploaded_file($file['tmp_name'],$filePath)){
        alert("上传成功:文件路径:".$filePath);
    }else{
        alert("移动文件失败");
    }
}
//提示用户并终止程序
function alert($msg){
  exit("<script>alert('".$msg."')</script>");
}
//获取文件的后缀
function get_suffix($fileName){
  $file_end = explode('.',$fileName);
  return $file_end[count($file_end)-1];
}
//获取文件名称(不含后缀)
function get_file_name($fileName){
  $file_end = explode('.',$fileName);
  $name = '';
  for($i=0;$i<count($file_end);$i++){
    if($i!=count($file_end)-1){
      $name.=$file_end[$i];
    }
  }
  return $name;
}
//生成新的名称(存在则随机生一个数字,如果还存在则递归生成)
function file_rename($name){
  $fileName = get_file_name($name).'-'.date("YmdHis",time()).'.'.get_suffix($name);
  if(file_exists("upload/".$fileName)){
    $tmpName = get_file_name($name).'-'.date("YmdHis",time()).'-'.rand(0,9).'.'.get_suffix($name);
    if(file_exists("upload/".$tmpName)){
        file_rename($name);
    }else{
      return $tmpName;
    }
  }else{
    return $fileName;
  }
}
?>
 Demo下载地址:


【七空幻音】PHP简单文件上传


详细图片
载入中...