截止目前已经改造了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. leetcode 152. 乘积最大子序列 java

    题目: 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. ...

  2. Tomcat安装及调试

    Web服务器的作用 1.接收客户端的请求 2.给客户端作出响应 我们也可以自己手写Web服务器,但是那样太麻烦,而且难度很大,所以我们可以 使用目前应用最广泛的Tomcat服务器 常见的Web服务器 ...

  3. [学习笔记]后缀自动机SAM

    好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...

  4. 我的AI之路 —— OCR文字识别快速体验版

    OCR的全称是Optical Character Recoginition,光学字符识别技术.目前应用于各个领域方向,甚至这些应用就在我们的身边,比如身份证的识别.交通路牌的识别.车牌的自动识别等等. ...

  5. VNC黑屏解决办法

    在Linux里安装配置完VNC服务端,发现多用户登陆会出现黑屏的情况,具体的现象为:客户端可以通过IP与会话号登陆进入系统,但登陆进去是漆黑一片,除了一个叉形的鼠标以外,伸手不见五指. 原因:用户的V ...

  6. InfluxDB Java入门

    添加依赖 <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java& ...

  7. python学习笔记10-文件操作

    能调用方法的一定是对象.文件本身也是一个对象.有很多自己内置的方法 #操作文件第一件事 建立文件对象 open函数 # 参数一:文件路径 绝对路径和相对路径都可以 # 参数二:模式选择 ‘r’ 读模式 ...

  8. python并发编程之进程池,线程池concurrent.futures

    进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多, 这会对 ...

  9. POJ 2876

    #include<iostream> #include<string> using namespace std; ]; int main() { //freopen(" ...

  10. rabbitmq系列五 之远程过程调用(RPC)

    1.远程过程调用(RPC) 在第二篇教程中我们介绍了如何使用工作队列(work queue)在多个工作者(woker)中间分发耗时的任务. 可是如果我们需要将一个函数运行在远程计算机上并且等待从那儿获 ...