form.html

<!DOCTYPE html>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
    <input type="file" name="spic"><br>
    <input type="submit" name="sub" value="上传文件">

    </form>
</body>
</html>

upload.php

<?php
include "./FileUpload.class.php";

$up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt','doc','pig','gif','php','jpg'),'filePath'=>'./upload/','maxSize'=>2000000));

if($up->uploadFile('spic')){
    echo $up->getNewFileName();
}else{
    echo $up->getErrorMsg();
}
//var_dump($up);
?>

FileUpload.class.php

<?php
class FileUpload{
    //上传文件保存的路径
    private $filePath;
    //允许上传文件的类型
    private $allowType=array('gif','jpg','png','jpeg');
    //上传文件的最大尺寸  1M
    private $maxSize=1000000;
    //是否是随机文件名
    private $isRandName=true;
    //原文件名称
    private $originName;
    //临时文件名称
    private $tmpFileName;
    //文件类型
    private $fileType;
    //文件的大小
    private $fileSize;
    //新文件名
    private $newFileName;
    //错误号
    private $errorNum;
    //用来提供错误报告
    private $errorMess;

    //用于对上传文件的初始化
    //1.指定上传的路径。2.允许的类型。3.限制大小。4.是否使用随机文件名
    //让用户可以不用按位置传参数,后面参数給值不用将前几个参数也提供值
    function __construct($options=array()){
        /*$this->filePath=$filePath;
        $this->allowType=$allowType;
        $this->maxSize=$maxSize;
        $isRandName=$isRandName;*/
        foreach ($options as $key => $value) {
            //将传过来的$key全转变成小写
            //$key=strtolower($key);
            //查看用户参数中数组的下标是否和成员属性名相同
            if(!in_array($key,get_class_vars(get_class($this)))){
                continue;
            }
            $this->setOption($key,$value);
        }
        /*print_r(get_class_vars(get_class($this)));*/

    }

    private function setOption($key,$value){
        $this->$key=$value;
    }

    private function getError(){
        $str="上传文件<font color='red'>{$this->originName}</font>时出错!";

        switch($this->errorNum){
            case 4:$str.="没有文件被上传!";break;
            case 3:$str.="文件只被部分上传!";break;
            case 2:$str.="上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值!";break;
            case 1:$str.="上传文件超过了php.ini中的upload_max_filesize选项的值!";break;
            case -1:$str.="未允许的类型";break;
            case -2:$str.="文件过大,上传文件不能超过{$thi->maxSize}个字节";break;
            case -3:$str.="上传失败";break;
            case -4:$str.="创建存放上传文件目录失败,请重新指定上传目录";break;
            case -5:$str.="必须指定上传文件的路径";break;
            default:$str.="未知错误";

        }
        return  $str."<br>";
    } 

    //用来检查文件上传路径
    private function checkFilePath(){
        if(empty($this->filePath)){
            $this->setOption('errorNum',-5);
            return false;
        }
        if(!file_exists($this->filePath)||!is_writable($this->filePath)){
            if(!@mkdir($this->filePath)){
                $this->setOption('errorNum',-4);
                return false;
            }
        }
        return true;
    }

    //用于检查文件上传的大小
    private function checkFileSize(){
        if($this->fileSize>$this->maxSize){
            $this->setOption('errorNum',-2);
            return false;
        }else{
        return true;
    }
}

    //用于检查文件上传类型
    private function checkFileType(){
        if(in_array($this->fileType,$this->allowType)){
            return true;
        }else{
            $this->setOption('errorNum',-1);
            return false;
        }
    }

    //设置上传后的文件名称
    private function setNewFileName(){
        if($this->isRandName){
            $this->setOption('newFileName',$this->proRandName());
        }else{
            $this->setOption('newFileName',$this->originName);
        }
    }

    //是否设置随机文件名
    private function proRandName(){
        $fileName=date("Y").date("m").date("d").date("H").date("i").date("s").rand(100,999).".";    //随机文件名
        return $fileName.".".$this->fileType;
    }

    //用来上传一个文件
    function uploadFile($fileFied){
        $return=true;
        //检查文件上传路径
        if(!$this->checkFilePath()){
            $this->errorMess=$this->getError();
            return false;
        }
        $name=$_FILES[$fileFied]['name'];
        $tmp_name=$_FILES[$fileFied]['tmp_name'];
        $size=$_FILES[$fileFied]['size'];
        $error=$_FILES[$fileFied]['error'];

        if($this->setFiles($name,$tmp_name,$size,$error)){
            //检查文件的尺寸和类型
            if($this->checkFileSize()&&$this->checkFileType()){
                $this->setNewFileName();
                if($this->copyFile()){
                    return true;
                }else{
                    $return=false;
                }
            }else{
                $return=false;
            }
        }else{
            $return=false;
        }
        if(!$return){
            $this->errorMess=$this->getError();
        }
        return $return;
    }

    //把上传的文件从临时文件中拷贝出来
    private function copyFile(){
        if($this->errorNum==0){
            //无论上传的路径是否有“/”都加上“/”
            $filePath=rtrim($this->filePath,'/').'/';
            $filePath.=$this->newFileName;

            if(@move_uploaded_file($this->tmpFileName, $filePath)){
                return true;
            }else{
                $this->setOption('errorNum',-3);
                return false;
            }
        }else{
            return false;
        }
    }

    //设置和$_FILES有关的内容
    private function setFiles($name="",$tmp_name="",$size=0,$error=0){
        $this->setOption('errorNum',$error);
        if($error){
            return false;
        }
        $this->setOption('originName',$name);
        $this->setOption('tmpFileName',$tmp_name);
        //分割
        $arrStr=explode('.', $name);
        $this->setOption('fileType',$arrStr[count($arrStr)-1]);
        $this->setOption('fileSize',$size);
        return true;
    }

    //用于获取上传后文件的文件名
    function getNewFileName(){
        return $this->newFileName;
    }

    //上传如果失败,则调用这个方法,就可以查看错误报告
    function getErrorMsg(){
        return $this->errorMess;
    }
}
?>

PHP设计的超强大的文件上传类(单文件上传)的更多相关文章

  1. Spring MVC-------文件上传,单文件,多文件,文件下载

    Spring MVC 框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过 Spring MVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了 ...

  2. SpringMVC文件上传下载(单文件、多文件)

    前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...

  3. php文件上传之单文件上传

    为了简单一些,php文件跟form表单写在了一个文件里. php单文件上传----> <!DOCTYPE html> <html> <head> <me ...

  4. SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)

    Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...

  5. java文件上传(单文件 多文件)与删除

    /** * 文件上传--单文件 * * @param request * @param response * @param path * 文件存放路径(path为WebApp\后面的内容) * @re ...

  6. Struts1文件上传、单文件、多文件上传【Struts1】

     将struts1文件上传的操作汇总了一下,包括单文件上传和多文件上传,内容如下,留作备忘: Struts2实现文件上传的文章(http://blog.csdn.net/itwit/article/d ...

  7. C#文件上传类,文件流,字节数组等

    using System;using System.IO;using System.Web;using System.Web.UI.WebControls; namespace DotNet.Util ...

  8. flask 文件上传(单文件上传、多文件上传)

    文件上传 在HTML中,渲染一个文件上传字段只需要将<input>标签的type属性设为file,即<input type=”file”>. 这会在浏览器中渲染成一个文件上传字 ...

  9. springMVC上传功能(单文件和多文件上传)

    单文件和多文件上传 首先在xxx-select.xml里面配置上传的大小和编码 <bean id="multipartResolver" class="org.sp ...

随机推荐

  1. 【Delphi7】 解决“程序第一次可以正常编译,但再次编译的时候会报错,必须重新打开Delphi”的问题

    报错如下: Access violation at address 00495044 in module 'coreide70.bpl'. Read of address...Access viola ...

  2. Windows 2008 R2+iis7.5环境下Discuz!X3论坛伪静态设置方法

    2008R2不是那么的普及,加上X3版新出不久,所以伪静态的设置教程比较少,今天搞出来了,其实很简单,那么下面给大家简要说明一下.因为iis7.5集成了url重写,那就就方便多了,首先安装好你的dz论 ...

  3. shell-参数做下标

    test.sh #!/bin/bash#用第3个参数作为下标或position,来获取参数param=$(eval echo \$$3)echo "hello, $param"

  4. SWM格式稀疏权重矩阵转换为方阵形式全过程分享

    在进行空间统计实验过程中,经常涉及到空间权重矩阵的处理,有时候需要将ArcGIS生成的swm格式的权重矩阵转换为形如“0 1”的方阵格式.这里将我的办法整理出来. 1.用如下工具箱生成swm格式的权重 ...

  5. php crc32,md5,sha1,mhash测试结果

    总结:php  自带hash mhash 用于散列只能加密   扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致. 1.crc32 php: a.系统crc ...

  6. C# 技巧(3) C# 操作 JSON

    RestAPI中, 经常需要操作json字符串,  需要把json字符串"反序列化"成一个对象, 也需要把一个对象"序列化"成一字符串. C# 操作json, ...

  7. 多项目开发下的dll文件管理

    阅读目录: DS01:为什么要对生成的dll文件进行管理? DS02:首先介绍以下两个DOS命令 DS03:第一种实现方法(xcopy) DS04:第二种实现方法(attrib) DS05:分享一个有 ...

  8. QT 做软件盘

    最近搞了一个组织细胞脱水机项目,当然,对于国内的项目都是仿来仿去的,我们也不例外,开启被仿机器后,第一个看到的界面就是用户登录界面,需要输入中文,作为一个程序员,我的第一反应就是我需要采用什么用的框架 ...

  9. 【C#】 格式化说明符 string.Format WriteLine

    定义 格式说明符的语法由3个字段组成:索引号.对齐说明符和格式字段.String.Format和WriteLine都遵守同样的格式化规则. 对齐说明符 对齐说明符表示了字段中字符的最小宽度.对齐说明符 ...

  10. 《Pro Express.js》学习笔记——概述

    要学Node.js,先学Express.js. Express.js是Node.js官方推荐的基础框架. Express.js框架经过一系列的发展,已经到了4.x版本.新的版本解决了3.x之前版本的依 ...