PHP通用文件上传类

    由于做项目中经常遇到文件上传,因此封装了一个通用的文件上传类,作用支持组文件上传,并且不同的上传域可以上传不同的文件类型,不同的文件类型限制的文件大小也可能不相同。举例来说:用户可上传一种展品并可为该展品上传一张缩略图,那么缩略图文件限制类型可能为jpg,gif,png等,而展品文件限制类型可能为mov,avi,mpeg等,而图片大小可能限制为100KB,音频视频大小可能限制为2MB。类代码如下:

/* 文件上传类 */
class Upload
{
    public $InputName;    // 文件上传域控件名
    
    /**  
    * 允许上传的文件类型
    * 形式为 array(''image/jpeg'', ''image/png'', ''image/gif'') 或包含此类数组的数组(与每个上传域控件对应)
    */
    public $FileType;
    
    /**  
    * 最大上传文件大小(单位:byte)
    * 形式为 array(''image'' => $size, ''audio'' => $size)(表示每种应用文件类型所对应的上传大小) 或包含此类数组的数组(与每个上传域控件对应)或一数值(表示所有上传文件均限制在此大小之下)
    */
    public $FileMaxSize; 
    
    public $FileSavePath;  // 文件保存路径(可为数组形式,表示不同上传域上传文件到不同的路径)
    public $FileSaveName;  // 文件保存名(不包含后缀名)(可为数组形式,表示不同上传域上传文件保存的不同名称)
    public $NoteFileFalse; // 文件错误提示
    public $NoteFileType;  // 文件类型不符提示
    public $NoteFileSize;  // 文件大小超出提示
    
    /* 上传文件并返回文件名信息(包含后缀名) */
    public function UploadFile()
    {
        $this->CheckFile(); // 检验文件
        $file = $_FILES[$this->InputName];
        $file_number = count($file[''name'']); // 要上传的文件数
        $file_save_full_name = array(); // 文件保存名(包含后缀名)
        
        for ($i = 0; $i < $file_number; $i++)
        {
            $name = $file[''name''][$i];
            
            if (!empty($name)) // 文件不为空
            {
                /* 确定文件保存路径 */
                if (is_array($this->FileSavePath))
                {
                    $file_save_path = $this->FileSavePath[$i];
                }
                else 
                {
                    $file_save_path = $this->FileSavePath;
                }
                
                /* 确定文件保存名(不包含后缀名) */
                if (is_array($this->FileSaveName))
                {
                    $file_save_name = $this->FileSaveName[$i];
                }
                else 
                {
                    $file_save_name = $this->FileSaveName;
                }
                
                /* 开始保存 */
                $this->CreatePath($file_save_path); // 如果路径不存在则创建路径
                if (!move_uploaded_file($file["tmp_name"][$i], $file_save_path . $file_save_name . $this->GetSuffix($file[''name''][$i])))
                {
                    die($name . ''文件上传失败'');
                }
                else 
                {
                    $file_save_full_name[] = $file_save_name . $this->GetSuffix($file[''name''][$i]);
                }
            }
            else 
            {
                $file_save_full_name[] = null;
            }
        }
        
        unlink($file);
        
        /* 如果只有一个文件,则返回单个文件名 */
        if (count($file_save_full_name) == 1)
        {
            $file_save_full_name = $file_save_full_name[0];
        }
        
        return $file_save_full_name;
    }
    
    /* 检验文件 */
    private function CheckFile()
    {
        $file = $_FILES[$this->InputName];
        $file_number = count($file[''name'']); // 要上传的文件数
        
        for ($i = 0; $i < $file_number; $i++)
        {
            if (!empty($file[''name''][$i])) // 文件不为空
            {
                $name  = $file[''name''][$i];
                $type  = $file[''type''][$i];
                $size  = $file[''size''][$i];
                $error = $file[''error''][$i];
                
                /* 确定允许上传文件类型列表 */
                if (is_array($this->FileType[0]))
                {
                    $file_type = $this->FileType[$i];
                }
                else 
                {
                    $file_type = $this->FileType;
                }
                
                /* 确定最大上传文件大小 */
                if (is_array($this->FileMaxSize))
                {
                    $file_max_size_key = explode(''/'', $type);
                    $file_max_size_key = $file_max_size_key[0];
                    if (is_array($this->FileMaxSize[0]))
                    {
                        $file_max_size = $this->FileMaxSize[$i][$file_max_size_key];
                    }
                    else 
                    {
                        $file_max_size = $this->FileMaxSize[$file_max_size_key];
                    }
                }
                else 
                {
                    $file_max_size = $this->FileMaxSize;
                }
                
                /* 文件错误 */
                if ($error > 0)
                {
                    die($name . $this->NoteFileFalse);
                }
                
                /* 文件类型不符 */
                if (!in_array($type, $file_type))
                {
                    die($name . $this->NoteFileType);
                }
                
                /* 文件大小超过最大上传文件大小 */
                if (!is_null($file_max_size) && $size > $file_max_size)
                {
                    die($name . $this->NoteFileSize);
                }
            }
        }
    }
    
    /* 获取文件后缀名 */
    private function GetSuffix($fileName)
    {
        return substr($fileName, strrpos($fileName, "."));
    }

    /* 如果路径不存在则创建路径 */
    private function CreatePath($filePath)
    {
        if (!file_exists($filePath))
        {
            mkdir($filePath);
        }
    }
}

使用方法:接着以本文开头所举例子来说明该类的调用方法(呵呵,调用是很方便的):
$upload_obj = new Upload(); // 文件上传对象
$upload_obj->InputName = ''upload_test''; // 文件上传域控件名
$upload_obj->FileType = array(array(''image/jpeg'', ''image/png''), array(''audio/mpeg'', ''video/x-msvideo'')); // 允许上传的文件类型
$upload_obj->FileMaxSize = array(''image'' => 100 * 1024, ''audio'' => 2 * 1024 * 1024, ''video'' => 2 * 1024 * 1024);
$upload_obj->FileSavePath = array(''upload/files/s/'', ''upload/files/z/'');
$upload_obj->FileSaveName = time();
$upload_obj->NoteFileFalse = ''文件错误'';
$upload_obj->NoteFileType  = ''文件类型不符'';
$upload_obj->NoteFileSize  = ''文件大小超出'';
$file_save_full_name = $upload_obj->UploadFile(); // 上传并获取文件全名(基本名加扩展名)(如果是多个文件则为数组形式)(全名用于在数据库中存储信息)

总结:就此可轻松实现若干文件上传,其实归根结底用到了PHP组文件上传,要注意的就是控件名的name后别忘了加上[],这样的好处就是遇到多个文件上传时就不用在调用层进行循环或一个一个处理上传了,我们的应用也因此而轻松。

时间: 2024-10-06 11:54:29

PHP通用文件上传类的相关文章

C# 通用文件上传类_实用技巧

1.Upfile.aspx: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Upfile.aspx.cs" Inherits="Inc_Upfile" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

PHP中codeigniter文件上传类代码实例

  codeigniter文件上传类代码实例 文件上传类 CodeIgniter 的文件上传类允许文件被上传.您可以设置指定上传某类型的文件及指定大小的文件. 处理过程 上传文件普遍的过程: 一个上传文件用的表单,允许用户选择一个文件并上传它. 当这个表单被提交,该文件被上传到指定的目录. 同时,该文件将被验证是否符合您设定的要求. 一旦文件上传成功,还要返回一个上传成功的确认窗口. 这里有一个简短的教程来显示这个过程.此后你将会找到相关的参考信息. 创建上传表单 运用文本编辑器创建一个名为up

经典的PHP文件上传类

在课堂上给大家写了一个经典的文件上传类,灵活性还可以,大家可以参考使用,   上传文件:   <?php /** * author : PHP100.com * date :2012-9-15 经典的文件上传类  **/  if(!empty($_POST['sub'])){   include("up.class.php");      $up = new up($_FILES['up']); //参数,文件流必选,[指定目录,指定大小,指定文件名]可选  }  ?>  

ASP.NET实现的简单易用文件上传类

  这篇文章主要介绍了ASP.NET实现的简单易用文件上传类,本文给出实现代码和使用方法示例,需要的朋友可以参考下 调用方法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 UploadFile uf = new UploadFile();   /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认:true),true原始文件名,false系统生成新文件名

PHP多文件上传类

  PHP多文件上传类 /* 多文件上传类 修改:Linvo 2008-2-15 */ class more_file_upload{ const FILE_PATH='../upfileclass/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

功能强大的php文件上传类_php技巧

本文实例为大家分享了php文件上传类,功能很强大,供大家参考,具体内容如下 <?PHP /* *文件上传类 **/ class upfile{ private $file_size;//上传源文件大小 private $file_tem;//上传文件临时储存名 private $file_name;//上传文件名 private $file_type;//上传文件类型 private $file_max_size=2000000;//允许文件上传最大 private $file_folder=&qu

一个经典的PHP文件上传类分享_php实例

文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码.为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中.帮助开发者在以后的开发中,通过编写几条简单代码就可以实现复杂的文件上传功能.对于基础薄弱的读者,只要会使用本类即可,而对一些喜欢挑战的朋友,可以尝试去读懂它,并能开发一个属于自己的文件上传类. 一.需求分析 要球自定义文件上传类,即在使用非常简便的前提下,又可以完成以下几项功能

PHP多文件上传类实例_php技巧

本文实例讲述了PHP多文件上传类.分享给大家供大家参考.具体如下: 复制代码 代码如下: <?php /* PHP多文件上传类 修改:Linvo 2008-2-15 */ class more_file_upload{     const FILE_PATH='../upfileclass/uploadfile/';     var $file_type;     var $file_type_array;     var $file_type_real_array;     var $file

PHP文件上传类实例详解_php技巧

本文实例讲述了PHP文件上传类.分享给大家供大家参考,具体如下: 这里演示了FileUpload.class.php文件上传类,其中用到了两个常量,可在网站配置文件中定义: define('ROOT_PATH',dirname(__FILE__)); //网站根目录 define('UPDIR','/uploads/'); //上传主目录 具体代码如下: <?php //上传文件类 class FileUpload { private $error; //错误代码 private $maxsiz