PHP设计超级好用的文件上传处理类一 (37)

<?php
    class FileUpload {
        private $filepath;     //指定上传文件保存的路径
        private $allowtype=array(‘gif‘, ‘jpg‘, ‘png‘, ‘jpeg‘);  //充许上传文件的类型
        private $maxsize=1000000;  //允上传文件的最大长度 1M
        private $israndname=true;  //是否随机重命名, true false不随机,使用原文件名
        private $originName;   //源文件名称
        private $tmpFileName;   //临时文件名
        private $fileType;  //文件类型
        private $fileSize;  //文件大小
        private $newFileName; //新文件名
        private $errorNum=0;  //错误号
        private $errorMess=""; //用来提供错误报告

        //用于对上传文件初使化
        //1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称
        //让用户可以不用按位置传参数,后面参数给值不用将前几个参数也提供值
        function __construct($options=array()){
            foreach($options as $key=>$val){
                $key=strtolower($key);
                //查看用户参数中数组的下标是否和成员属性名相同
                if(!in_array($key,get_class_vars(get_class($this)))){
                    continue;
                }

                $this->setOption($key, $val);
            }

        }

        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 .= "文件过大,上传文件不能超过{$this->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([email protected]($this->filepath, 0755)){
                    $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(strtolower($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("YmdHis").rand(100,999);
            return $fileName.‘.‘.$this->fileType;
        }

        private function setOption($key, $val){
            $this->$key=$val;
        }
        //用来上传一个文件
        function uploadFile($fileField){
            $return=true;
            //检查文件上传路径
            if(!$this->checkFilePath()){
                $this->errorMess=$this->getError();
                return false;
            }

            $name=$_FILES[$fileField][‘name‘];
            $tmp_name=$_FILES[$fileField][‘tmp_name‘];
            $size=$_FILES[$fileField][‘size‘];
            $error=$_FILES[$fileField][‘error‘];

            if(is_Array($name)){
                $errors=array();

                for($i=0; $i<count($name); $i++){
                    if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
                        if(!$this->checkFileSize() || !$this->checkFileType()){
                            $errors[]=$this->getError();
                            $return=false;
                        }
                    }else{
                        $error[]=$this->getError();
                        $return=false;
                    }

                    if(!$return)
                        $this->setFiles();
                }

                if($return){
                    $fileNames=array();

                    for($i=0; $i<count($name); $i++){
                        if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
                            $this->setNewFileName();
                            if(!$this->copyFile()){
                                $errors=$this->getError();
                                $return=false;
                            }else{
                                $fileNames[]=$this->newFileName;
                            }
                        }
                    }

                    $this->newFileName=$fileNames;
                }

                $this->errorMess=$errors;
                return $return;
            } else {

                    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){
                $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‘, strtolower($arrStr[count($arrStr)-1]));
            $this->setOption(‘fileSize‘, $size);    

            return true;
        }    

        //用于获取上传后文件的文件名
        function getNewFileName(){
            return $this->newFileName;
        }
        //上传如果失败,则调用这个方法,就可以查看错误报告
        function getErrorMsg() {
            return $this->errorMess;
        }
    }
时间: 2024-10-12 01:14:21

PHP设计超级好用的文件上传处理类一 (37)的相关文章

文件上传帮助类

using System; using System.Collections.Generic; using System.Text; using System.Web.UI.WebControls; using System.IO; namespace AIMSCommon { /// <summary> /// 文件上传帮助类 /// </summary> public class UploadHelper { /// <summary> /// 文件上传 /// &

spring mvc 文件上传工具类

虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:HttpServletRequest request 参数2:String storePath   //文件存储相对路径 ,例如:"/upload","/image","/local/file" 返回值:上传到服务器的相对路径 一:代码实现 import

文件上传工具类 UploadUtil.java

package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util

文件上传工具类——傻瓜式上传文件

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6128382.html 在前面  (http://www.cnblogs.com/ygj0930/p/6073505.html)  我们提到过Javaweb开发的文件上传功能的实现,需要借助第三方jar包,并且要创建factory呀.设置临时文件区路径呀等等,十分繁琐.而作为一个开发人员,不可能每次实现文件上传时都从头到尾做那么多工序.这时候,我们可以把这些繁琐的工作封装起来,把一个个功能做成以供调用的方法.

文件上传工具类(重命名,以及判断类型)

public class FileUploadUtil {     public static final List<String> ALLOW_TYPES = Arrays.asList(             "image/jpg","image/jpeg","image/png","image/gif"     ); //文件重命名     public static String rename(Strin

iOS开发 - 封装文件上传工具类

文件上传的步骤 1.设置请求头 * 目的:告诉服务器请求体里面的内容并非普通的参数,而是包含了文件参数 [request setValue:@"multipart/form-data; boundary=maljob" forHTTPHeaderField:@"Content-Type"]; 2.设置请求体 * 作用:存放参数(文件参数和非文件参数) 1> 非文件参数 [body appendData:MalJobEncode(@"--maljob\

Uploader 文件上传器类

概述 客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由服务端存储断点信息实现断点续传的功能:支持文件拖拽上传,直接将文件拖拽到页面元素上方即可自动上传(默认元素是body):服务端采用asp.net 4.0程序开发,包含有处理程序,提供程序和视图控件,当然也可以用java或者php实现服务端程序. 浏览器兼容:IE10+.火狐.谷歌.Opera.win

django-自定义文件上传存储类

文件储存API:https://yiyibooks.cn/xx/django_182/ref/files/storage.html 编写自定义存储系统:https://yiyibooks.cn/xx/django_182/howto/custom-file-storage.html 定义一个自定义的储存类步骤 1.你的自定义储存类必须是django.core.files.storage.Storage的子类 2.Django必须能够不带任何参数来实例化你的储存类.这意味着任何设置都应该从djan

atitit. 文件上传带进度条 atiUP 设计 java c# php

atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.xml 3 6. struts extand url 3 7. behide code 3 8. 简化设计 3 1. 设计要求 带进度条 完成提示动画效果.. 2. 原理and 架构 如果需要显示进度条,实时显示文件上传进度 需要使用Ajaxj技术..up到个在的iframe黑头.. 工作原理 其实际