玄元一墨 发表于 2022-8-25 22:03:04

PHP 文件上传


上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 "upload" 的目录下。

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp);   // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
      echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
      echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
      echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
      echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
      echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
      
      // 判断当前目录下的 upload 目录是否存在该文件
      // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
      if (file_exists("upload/" . $_FILES["file"]["name"]))
      {
            echo $_FILES["file"]["name"] . " 文件已经存在。 ";
      }
      else
      {
            // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
            echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
      }
    }
}
else
{
    echo "非法的文件格式";
}
?>

玄元一墨 发表于 2023-2-2 21:09:12

再附一段取自摇光框架的PHP上传类:


/**
* 数据上传类: 快速接收用户传来的文件.
*/
class UploadData
{
    const SUCCESS_UPLOAD = "文件上传成功.";

    const ERROR_NO_EXTENSION = "错误: 不允许使用的扩展名.";
    const ERROR_FILE_TOOBIG = "错误: 文件大小超出限制.";
    const ERROR_FILE_SAMENAME = "错误: 文件与已有文件重名.";

    const EXTENSION_NO_PHP = array("php");

    public $log_obj;

    /**
   * 构造方法: 检测是否存在文件存贮目录.
   */
    public function __construct(){
      //实例化日志操作类
      $this->log_obj = new LogHandler;

      if(!file_exists("./data/")){
            mkdir("./data/");
      }
        }

    /**
   * 成员方法: 监听用户是否上传.
   * $file_dir: 文件存储目录.
   * $file_name: 文件名字 (可选).
   * $extension: 允许或不允许的文件扩展名集合 (可选).
   * $extension_whitelist: 扩展名检测为白名单模式还是黑名单模式,$extension设置后才有效 (可选).
   * $file_max_size: 允许的文件最大的大小,以MB为单位 (可选).
   * $file_KeyName: 前端表单里input标签的name属性的值 (可选).
   */
    public function monitor_upload($file_dir , $file_name = null , $extension = null , $extension_whitelist = true , $file_max_size = 2048 , $file_KeyName = "file"){
      //将$file_max_size的单位从MB转换为B
      $file_max_size = $file_max_size * 1024 * 1024;

      //检测是否传入了文件
      if(isset($_FILES[$file_KeyName])){

            //是否使用用户传入的文件的原名
            if(is_null($file_name)){$file_name = $_FILES[$file_KeyName]["name"];}

            if($_FILES[$file_KeyName]["size"] > $file_max_size){
                $this->log_obj->log_write(null , array("Class: ".__CLASS__." Function: ".__FUNCTION__." return: ".$this::ERROR_FILE_TOOBIG));
                TpPrint::common_print($this::ERROR_FILE_TOOBIG);
                return $this::ERROR_FILE_TOOBIG;
            }

            //检测指定的二级存贮目录是否存在.
            if(!file_exists("./data/".$file_dir)){
                mkdir("./data/".$file_dir);
            }

            //检测是以白名单模式还是黑名单模式筛选文件扩展名
            if(!is_null($extension)){
                if($extension_whitelist){
                  //白名单模式
                  $file_extension = get_file_extension($_FILES[$file_KeyName]["name"]);
                  if(!in_array($file_extension , $extension)){
                        $this->log_obj->log_write(null , array("Class: ".__CLASS__." Function: ".__FUNCTION__." return: ".$this::ERROR_NO_EXTENSION));
                        TpPrint::common_print($this::ERROR_NO_EXTENSION);
                        return $this::ERROR_NO_EXTENSION;
                  }
                }else{
                  //黑名单模式
                  $file_extension = get_file_extension($_FILES[$file_KeyName]["name"]);
                  if(in_array($file_extension , $extension)){
                        $this->log_obj->log_write(null , array("Class: ".__CLASS__." Function: ".__FUNCTION__." return: ".$this::ERROR_NO_EXTENSION));
                        TpPrint::common_print($this::ERROR_NO_EXTENSION);
                        return $this::ERROR_NO_EXTENSION;
                  }
                }
            }

            if(file_exists("./data/".$file_dir."/".$file_name)){
                $this->log_obj->log_write(null , array("Class: ".__CLASS__." Function: ".__FUNCTION__." return: ".$this::ERROR_FILE_SAMENAME));
                TpPrint::common_print($this::ERROR_FILE_SAMENAME);
                return $this::ERROR_FILE_SAMENAME;
            }

            //从缓存目录将文件移动至指定目录
            move_uploaded_file($_FILES[$file_KeyName]["tmp_name"] , "./data/".$file_dir."/".$file_name);
            if(file_exists("./data/".$file_dir."/".$file_name)){
                $this->log_obj->log_write(null , array("Class: ".__CLASS__." Function: ".__FUNCTION__." return: ".$this::SUCCESS_UPLOAD));
                TpPrint::common_print($this::SUCCESS_UPLOAD , "提示信息" , true);
                return true;
            }
      }
    }
}

页: [1]
查看完整版本: PHP 文件上传