自定义MVC框架之工具类-文件上传类
截止目前已经改造了3个类:
该文件上传类功能如下:
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框架之工具类-文件上传类的更多相关文章
- Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...
- 自定义MVC框架之工具类-模型类
截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...
- 自定义MVC框架之工具类-图像处理类
截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...
- MVC&WebForm对照学习:文件上传(以图片为例)
原文 http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页:: :: :: ::管理 5 Posts :: 0 ...
- ThinkPHP文件上传类
TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...
- ASP.NET 文件上传类 简单好用
调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...
- PHP 文件上传类
FileUpload.; $]; $_newname = date(,). : To ...
- node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传
node.js下四种post提交数据的方式 今天说分享的是其中一种,就是上传文件. Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件 今天主要分享文件上传 对于conne ...
- php 文件上传类 实例分享
最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...
随机推荐
- 564. Find the Closest Palindrome
Given an integer n, find the closest integer (not including itself), which is a palindrome. The 'clo ...
- 使用Flask+uwsgi+Nginx部署Flask正式环境
环境准备 在开始正式讲解之前,我们将首先进行环境准备. Step1:安装Python,pip以及nginx: sudo apt-get update sudo apt-get install pyth ...
- Swfit 里 Array(五)和 NSArray 转换
 只看 Swift Array 到 NSArray Array 里的源代码 extension Array { @inlinable public // @SPI(Foundation) func ...
- python学习笔记14-函数
使用关键字def来创建函数 注意缩进 函数命名规则: 1.必须以下划线或者字母开头 2.区分大小写 3.不能是保留字 调用函数一定记得加括号 def print_info(name,age) pri ...
- SpringBoot从入门到逆天(1)
1.SpringBoot是什么? <1>为Sping开发提供一个更 快捷更广泛的入门体验. <2>开箱即用,不合适时特可以快速抛弃. <3>提供一系列大型项目常用的 ...
- Python程序的打包-上传到pypi
pypi注册与配置 在pypi的官网:https://pypi.python.org/pypi 注册自己的账号激活账号之后,我们还需要将在本地配置一份文件 在用户的根目录创建文件 : .pypirc在 ...
- 01-Linux的基本指令
Linux的基本指令 基础指令(重点) 1.ls指令: 含义:ls(list) 用法1:#ls 含义:列出当前工作目录下的所有文件/文件夹的名称 用法2:#ls 路径 含义:列出指定路径下的所有文件 ...
- Strom的trident单词计数代码
/** * 单词计数 */ public class LocalTridentCount { public static class MyBatchSpout implements IBatchSpo ...
- 全网最详细的Windows里下载与安装Sublime Text *(图文详解)
不多说,直接上干货! 前言 这是代码编程软件,可以性感编程自己代码,有着非常丰富的插件,界面整洁清爽.第一次使用可能不习惯,当你使用一段时间之后,你就会爱上它. 下载与安装 1.下载:目前官方的正式版 ...
- docker with redis
docker run --name myredis -d -v /home/rudy/pro/database/redis:/data -p : --privileged=true redis