截止目前已经改造了3个类:

ubuntu:通过封装验证码类库一步步安装php的gd扩展

自定义MVC框架之工具类-分页类的封装

该文件上传类功能如下:

1,允许定制上传的文件类型,文件mime信息,文件大小

2,自由定制文件名是随机还是保持原来的文件名

3,谨慎的检查,友好的错误提示,精确定位文件上传哪一步出问题

测试结果:

ghostwu@ghostwu:~/php/senior_php/upload$ tree
.
├── 19502QV8-.jpg
├── Upload
│   ├── ghostwu_5a94beb3b2690.jpg
│   ├── ghostwu_5a94c727a1f1a.php
│   └── ghostwu_5a94c740615dc.html
├── upload.html
└── upload.php

upload.php:

 <meta charset="utf-8" />
<?php class Upload {
//上传路径
private $path = './Upload';
//允许的文件类型
private $allowFileType = [ 'jpg', 'png', 'jpeg', 'wbmp', 'gif' ];
//允许的mime信息
private $allowMime = [ 'image/jpeg', 'image/gif', 'image/png', 'image/wbmp' ];
//允许的最大文件大小
private $maxSize = 2048000;
//运行随机文件名
private $enableRandName = true;
//文件前缀
private $prefix = 'ghostwu_'; //错误号
private $errorNo;
//错误信息
private $errorInfo; //文件原来的名称
private $originName;
//新的文件名称
private $newName;
//文件后缀
private $suffix;
//文件大小
private $size;
//文件mime信息
private $mime;
//临时文件名
private $tmpName; public function __construct( $fileInfo = [] ){
foreach ($fileInfo as $k => $v ) {
$this->setProperty( $k, $v );
}
} //设置成员属性
public function setProperty( $k, $v ){
$property = array_keys( get_class_vars( __CLASS__ ) );
if( in_array( $k, $property ) ){
$this->$k = $v;
}
} public function __get( $key ) {
if( $key == 'errorNo' ) {
return $this->errorNo;
}else if ( $key == 'errorInfo' ) {
return $this->getErrorInfo();
}
} protected function getErrorInfo(){
$info = '';
switch( $this->errorNo ){
case 1000:
$info = '没有设置上传路径';
break;
case 1001:
$info = '上传路径不存在,或者没有写权限';
break;
case 1002:
$info = '文件大小超过限制';
break;
case 1003:
$info = '文件的mime信息不在允许范围内';
break;
case 1004:
$info = '不允许上传这种类型的文件';
break;
case 1006:
$info = '文件不是通过表单上传的';
break;
case 1007:
$info = '文件移动失败';
break;
case 1:
$info = '文件超出php.ini设置的大小';
break;
case 2:
$info = '超出html表单设置的大小';
break;
case 3:
$info = '文件只有部分被上传';
break;
case 4:
$info = '没有文件被上传';
break;
case 6:
$info = '找不到临时文件';
break;
case 7:
$info = '文件写入失败';
break;
} return $info;
} protected function check(){
if( !file_exists( $this->path ) || !is_dir( $this->path ) ){
return mkdir( $this->path, 0777, true );
}
if( !is_writable( $this->path ) ){
return chmod( $this->path, 0777 );
}
return true;
} public function upload( $name ){
//判断是否设置了上传路径
if( empty( $this->path ) ) {
$this->setProperty( 'errorNo', 1000 );
return false;
}
//判断路径是否存在,可写
if( !$this->check() ) {
$this->setProperty( 'errorNo', 1001 );
return false;
}
//判断上传文件是否错误,提取原文件信息
$errorno = $_FILES[$name]['error'];
if( $errorno ) {
$this->setProperty( 'errorNo', $errorno );
return false;
}else {
$this->getFileInfo( $name );
}
//判断文件是否符合上传要求(大小,后缀,mime)
if( !$this->checkSize()
|| !$this->checkMime()
|| !$this->checkSuffix() ) {
return false;
}
//生成新的文件名
$this->newName = $this->createNewName();
//判断是否为上传文件
if( is_uploaded_file( $this->tmpName ) ) {
if( move_uploaded_file( $this->tmpName, $this->path . '/' . $this->newName ) ){
return $this->path . '/' . $this->newName;
}else {
$this->setProperty( 'errorNo', 1007 );
return false;
}
}else {
$this->setProperty( 'errorNo', 1006 );
return false;
}
} protected function createNewName(){
if ( $this->enableRandName ) {
$name = $this->prefix . uniqid() . '.' . $this->suffix;
}else {
$name = $this->prefix . $this->originName;
}
return $name;
} protected function getFileInfo( $name ){
$this->originName = $_FILES[$name]['name'];
$this->mime = $_FILES[$name]['type'];
print_r( $this->mime );
$this->tmpName = $_FILES[$name]['tmp_name'];
$this->size = $_FILES[$name]['size'];
$this->suffix = pathinfo( $this->originName )['extension'];
} protected function checkSize(){
if( $this->size > $this->maxSize ) {
$this->setProperty( 'errorNo', 1002 );
return false;
}
return true;
} protected function checkMime(){
print_r( $this->allowMime );
if( !in_array( $this->mime, $this->allowMime ) ) {
$this->setProperty( 'errorNo', 1003 );
return false;
}
return true;
} protected function checkSuffix(){
if( !in_array( $this->suffix, $this->allowFileType ) ) {
$this->setProperty( 'errorNo', 1004 );
return false;
}
return true;
} } $upload = new Upload( [ 'maxSize' => 204800 ] );
$upload->setProperty( 'allowFileType', ['jpg','jpeg', 'gif', 'php', 'html'] );
$upload->setProperty( 'allowMime', [ 'image/jpeg', 'image/gif', 'image/wbmp', 'application/x-php', 'text/html' ] ); $upload->upload( 'photo' ); echo $upload->errorNo . '<br/>';
echo $upload->errorInfo . '<br/>'; ?>

upload.html

 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>文件上传-by ghostwu</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data" >
<input type="file" name="photo" id="photo" />
<input type="submit" name="upload" id="upload" value="上传" />
</form>
</body>
</html>

自定义MVC框架之工具类-文件上传类的更多相关文章

  1. Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...

  2. 自定义MVC框架之工具类-模型类

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

  3. 自定义MVC框架之工具类-图像处理类

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

  4. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

  5. ThinkPHP文件上传类

    TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...

  6. ASP.NET 文件上传类 简单好用

    调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...

  7. PHP 文件上传类

    FileUpload.;                $];                $_newname = date(,). :                             To ...

  8. node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传

    node.js下四种post提交数据的方式 今天说分享的是其中一种,就是上传文件. Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件 今天主要分享文件上传 对于conne ...

  9. php 文件上传类 实例分享

    最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...

随机推荐

  1. Android逆向——smali复杂类解析

    i春秋作家:HAI_ 之前在Android逆向——初识smali与java类中讲解了基本的HelloWorld和简单类.这节课就要进一步深入.如果能够耐下心来分析一定会有所收获.——写给自己和后来人. ...

  2. Dubbo启动时服务检查

    所谓启动时服务检查是指Dubbo在启动的时候会检查当前引用的服务是否可用,不可用会抛出异常,阻止程序的初始化,以便能在上线前快速的找到问题,默认的情况下check=true 通过设置check=fal ...

  3. Swift5 语言参考(九) 泛型和参数

    本章介绍泛型类型,函数和初始值设定项的参数和参数.声明泛型类型,函数,下标或初始化程序时,可以指定泛型类型,函数或初始化程序可以使用的类型参数.当创建泛型类型的实例或调用泛型函数或初始化程序时,这些类 ...

  4. python批量拷贝文件

    普通批量拷贝文件 import os import shutil import logging from logging import handlers from colorama import Fo ...

  5. How to resize or create a thumbnail image from file stream on UWP

    最近在搞Ocr相关的windows universal app, 用到了一些图像处理相关的知识. 涉及到了BitmapDecoder/BitmapEncoder/IRandomAccessStream ...

  6. Web API 2 对于 Content-Length 要求严格

    最近在做一个工具,里面有一个发起http请求的操作,虽然工具不是用.NET写的,但是测试用服务器软件是.NET写的.在这里选择了ASP.NET MVC和Web API 2. 首先预定义Student与 ...

  7. Git for Windows之团队合作

    1.先给项目添加一个成员 输入对方码云邮箱账号,添加成功. 2.登陆,将码云上面的项目克隆到本地 (1).设置全局参数  用户名和邮箱用于push和pull代码 (2).克隆目标项目地址 查看本地文件 ...

  8. win2003 远程连接限制

    1.单击开始->运行,输入gpedit.msc,打开组策略编辑器,找到计算机配置 ->管理模版 -> Windows组件 ->终端服务.把限制连接数量的属性修改成我们需要的数字 ...

  9. 【转】谷歌三大核心技术(二)Google MapReduce中文版

      Google MapReduce中文版     译者: alex   摘要 MapReduce 是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现.用户首先创建一个Map函数处理一个 ...

  10. Log4j按级别输出日志到不同文件配置

    1.自定义LogFileAppender类,继承DailyRollingFileAppender,实现Log4j按级别输出日志到不同文件. package com.liying.mango.commo ...