PHP设计的超强大的文件上传类(单文件上传)
form.html
<!DOCTYPE html>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<input type="file" name="spic"><br>
<input type="submit" name="sub" value="上传文件">
</form>
</body>
</html>
upload.php
<?php
include "./FileUpload.class.php";
$up=new FileUpload(array('isRandName'=>true,'allowType'=>array('txt','doc','pig','gif','php','jpg'),'filePath'=>'./upload/','maxSize'=>2000000));
if($up->uploadFile('spic')){
echo $up->getNewFileName();
}else{
echo $up->getErrorMsg();
}
//var_dump($up);
?>
FileUpload.class.php
<?php
class FileUpload{
//上传文件保存的路径
private $filePath;
//允许上传文件的类型
private $allowType=array('gif','jpg','png','jpeg');
//上传文件的最大尺寸 1M
private $maxSize=1000000;
//是否是随机文件名
private $isRandName=true;
//原文件名称
private $originName;
//临时文件名称
private $tmpFileName;
//文件类型
private $fileType;
//文件的大小
private $fileSize;
//新文件名
private $newFileName;
//错误号
private $errorNum;
//用来提供错误报告
private $errorMess;
//用于对上传文件的初始化
//1.指定上传的路径。2.允许的类型。3.限制大小。4.是否使用随机文件名
//让用户可以不用按位置传参数,后面参数給值不用将前几个参数也提供值
function __construct($options=array()){
/*$this->filePath=$filePath;
$this->allowType=$allowType;
$this->maxSize=$maxSize;
$isRandName=$isRandName;*/
foreach ($options as $key => $value) {
//将传过来的$key全转变成小写
//$key=strtolower($key);
//查看用户参数中数组的下标是否和成员属性名相同
if(!in_array($key,get_class_vars(get_class($this)))){
continue;
}
$this->setOption($key,$value);
}
/*print_r(get_class_vars(get_class($this)));*/
}
private function setOption($key,$value){
$this->$key=$value;
}
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.="文件过大,上传文件不能超过{$thi->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(!@mkdir($this->filePath)){
$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($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("Y").date("m").date("d").date("H").date("i").date("s").rand(100,999)."."; //随机文件名
return $fileName.".".$this->fileType;
}
//用来上传一个文件
function uploadFile($fileFied){
$return=true;
//检查文件上传路径
if(!$this->checkFilePath()){
$this->errorMess=$this->getError();
return false;
}
$name=$_FILES[$fileFied]['name'];
$tmp_name=$_FILES[$fileFied]['tmp_name'];
$size=$_FILES[$fileFied]['size'];
$error=$_FILES[$fileFied]['error'];
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==0){
//无论上传的路径是否有“/”都加上“/”
$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',$arrStr[count($arrStr)-1]);
$this->setOption('fileSize',$size);
return true;
}
//用于获取上传后文件的文件名
function getNewFileName(){
return $this->newFileName;
}
//上传如果失败,则调用这个方法,就可以查看错误报告
function getErrorMsg(){
return $this->errorMess;
}
}
?>
PHP设计的超强大的文件上传类(单文件上传)的更多相关文章
- Spring MVC-------文件上传,单文件,多文件,文件下载
Spring MVC 框架的文件上传是基于 commons-fileupload 组件的文件上传,只不过 Spring MVC 框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了 ...
- SpringMVC文件上传下载(单文件、多文件)
前言 大家好,我是bigsai,今天我们学习Springmvc的文件上传下载. 文件上传和下载是互联网web应用非常重要的组成部分,它是信息交互传输的重要渠道之一.你可能经常在网页上传下载文件,你可能 ...
- php文件上传之单文件上传
为了简单一些,php文件跟form表单写在了一个文件里. php单文件上传----> <!DOCTYPE html> <html> <head> <me ...
- SpringBoot - 实现文件上传1(单文件上传、常用上传参数配置)
Spring Boot 对文件上传做了简化,基本做到了零配置,我们只需要在项目中添加 spring-boot-starter-web 依赖即可. 一.单文件上传 1,代码编写 (1)首先在 stati ...
- java文件上传(单文件 多文件)与删除
/** * 文件上传--单文件 * * @param request * @param response * @param path * 文件存放路径(path为WebApp\后面的内容) * @re ...
- Struts1文件上传、单文件、多文件上传【Struts1】
将struts1文件上传的操作汇总了一下,包括单文件上传和多文件上传,内容如下,留作备忘: Struts2实现文件上传的文章(http://blog.csdn.net/itwit/article/d ...
- C#文件上传类,文件流,字节数组等
using System;using System.IO;using System.Web;using System.Web.UI.WebControls; namespace DotNet.Util ...
- flask 文件上传(单文件上传、多文件上传)
文件上传 在HTML中,渲染一个文件上传字段只需要将<input>标签的type属性设为file,即<input type=”file”>. 这会在浏览器中渲染成一个文件上传字 ...
- springMVC上传功能(单文件和多文件上传)
单文件和多文件上传 首先在xxx-select.xml里面配置上传的大小和编码 <bean id="multipartResolver" class="org.sp ...
随机推荐
- 检查失败,<master>分支有过其他更新,请先在本地合并<master>分支的代码
- C#中XML和json互相转换
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xm ...
- WPF MVVM 学习总结(一)
---恢复内容开始--- 1. MVVM简介 在WPF中,MVVM(View-ViewModel-Model)开发模型用的很多,它具有低耦合,可重用行,相对独立的设计和逻辑.所以备受广大开发者的喜爱. ...
- Wpf之Xaml属性值和特性值(一)
其实我一直很好奇在xaml中,通过Attribute=Value这种方式可以进行对元素的描述, 例如: <Rectangle Name=” rectangle” Fill=”Blue”/> ...
- appcan.slider.js探索
1:-moz代表firefox浏览器私有属性 -ms代表IE浏览器私有属性 -webkit代表chrome.safari私有属性 2:定义新模块:appcan.define(name,function ...
- guava学习--AsyncFunction
AsyncFuntion接口与之前学习吃的使用Function和Functions进行对象转换有很密切的联系,AsyncFuction接口是Function接口的异步表现,AsyncFuction和F ...
- 关于vs调试中kaze时出现的问题
在kaze程序中,调试时,会出现内存释放出现问题,导致调试失败. 解决方法:将主函数所在的源文件中的所有函数中的vector声明的向量都放在主函数外面,成为全局变量,让系统自己释放,再次调试就不会出现 ...
- JQuery,拼接字符串问题(求助)
Js代码 $("#span_btnSave").html(str1); 结果 <span id="span_btnSave"><button ...
- vs安装后当切换到图形设计界面的时候自动弹出“正在准备安装的提升”,然后程序处于假死状态
Vs2008 安装后当切换到图形设计界面的时候自动弹出 ”正在准备安装的提示“,然后程序处于假死状态 在网上找了很多,最终解决问题: 从vs2008安装光盘中找到 /WCU/WebDesignerC ...
- μC/OS-Ⅲ系统中的任务就续表
μC/OS-Ⅲ支持任意数目的不同优先级.一般情况下64级优先级就足够了. 在μC/OS-Ⅲ中所有已经就绪等待运 行的任务都被放入一个我为的“就续表”(ready list)中.就续表包括两部分:一个就 ...