这是一个经常在项目中遇到的问题,所以封装一个,分享给大家。

一,前期配置php.ini     如果上传文件超过了php配置那么$_POST或者$_FILES等都是空数组,这点是一个坑,因为那时候就不能用$_FILES["uploadfile"]["size"]获取到文件大小了。

  1. upload_max_filesize = 8M    //上传文件大小
  2. post_max_size = 10M   //以POST上传文件大小
  3. memory_limit = 20M  //php脚本运行最大占有内存大小

二,表单实列a.php

<form action="b.php" method="POST" enctype="multipart/form-data" >
<input type="hidden" name="MAX_FILE_SIZE" value="30">

<!--如果设置上面这行表示,表单上传文件大小的限制,这样$_FILES["upfile"]["size"]为0,$_FILES["upfile"]["error"]为2,后面会有介绍"error"-->

<input type="file" name="upfile" id="upfile" /><br />
<br />
<input type="submit" />
</form>

三,php文件b.php

<?php

//获得文件扩展名
function get_file_extention( $fileName ){
return end(explode(".",$fileName));
}

//获得唯一随机名字
function get_uniname(){
return md5( uniqid(microtime(true) , true) );
}

//上传处理
function uploadfile($fileInfo,$path="uploads",$allowExt=array("png","jpg","jpeg","gif","zip"),$fileMaxSize=104857600000,$imageTag=true){
if(!$fileInfo){
exit("文件信息错误");//可能是文件超出了服务器限制
};
if($fileInfo["error"]==0){
//检查文件大小
if( $fileInfo['size'] > $fileMaxSize){
exit("文件大小超过");
}
//检查扩展
$ext = get_file_extention($fileInfo['name']);
if( !in_array($ext, $allowExt ) ){
exit("非法文件名");
}
//检查是否是真正的图片文件
if(!$imageTag){
if( !getimagesize( $fileInfo['tmp_name'])){
exit("不是真正的图片文件");
}
}
//检查文件是否是上传的文件
if( !is_uploaded_file( $fileInfo['tmp_name'])){
exit("非上传文件");
}
//检查上传目录是否存在
if(!file_exists($path))
{
mkdir($path,0777,true);
}
$fileName = get_uniname().".".$ext;
$destinationPath = $path."/".$fileName;
//上传
if(move_uploaded_file($fileInfo['tmp_name'],$destinationPath)){
$result =array("result"=>"图片上传成功","code"=>"0000","data"=>$destinationPath);
}else{
$result = array("result"=>"图片上传失败","code"=>"1111","data"=>$destinationPath);
};

}else{
switch($fileInfo['error']){
case 1:
$result=array("result"=>"超过了配置文件上传文件的大小","code"=>"0001","data"=>"");//UPLOAD_ERR_INI_SIZE
break;
case 2:
$result=array("result"=>"超过了表单设置上传文件的大小","code"=>"0002","data"=>""); //UPLOAD_ERR_FORM_SIZE
break;
case 3:
$result=array("result"=>"文件部分被上传","code"=>"0003","data"=>"");//UPLOAD_ERR_PARTIAL
break;
case 4:
$result= array("result"=>"没有文件被上传","code"=>"0004","data"=>"");//UPLOAD_ERR_NO_FILE
break;
case 6:
$result= array("result"=>"没有找到临时目录","code"=>"0005","data"=>"");//UPLOAD_ERR_NO_TMP_DIR
break;
case 7:
$result= array("result"=>"文件不可写","code"=>"0006","data"=>"");//UPLOAD_ERR_CANT_WRITE;
break;
case 8:
$result= array("result"=>"由于PHP的扩展程序中断了文件上传","code"=>"0006","data"=>"");//UPLOAD_ERR_EXTENSION
break;
}
}

return $result;
}
?>

php封装文件上传的更多相关文章

  1. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  2. struts2实现文件上传(多文件上传)及下载

    一.要实现文件上传,需在项目中添加两个jar文件 二.上传准备的页面 注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post &l ...

  3. Struts2文件上传和文件下载

    一.单个文件上传 文件上传需要两个jar包: 首先制作一个简单的页面,用于实现文件上传 <h1>单个文件上传</h1> <s:form action="uplo ...

  4. Struts2 文件上传和文件下载

    一.单个文件上传 文件上传需要两个jar包: 首先制作一个简单的页面,用于实现文件上传 <h1>单个文件上传</h1> <s:form action="uplo ...

  5. 文件上传&文件下载

    一.单个文件上传 文件上传需要两个jar包: 首先制作一个简单的页面,用于实现文件上传 <h1>单个文件上传</h1> <s:form action="uplo ...

  6. 7、Struts2实现文件上传和下载

    一.实现单个文件上传 1.创建如下web项目结构 2.在src下的com.action包下创建UploadAction.java package com.action; import java.io. ...

  7. Java使用Commons-FileUpload组件实现文件上传最佳方案

    学习的目标 使用commons-fileupload实现文件上传 使用commons-fileupload封装文件上传工具类   什么是commons-fileupload? The CommonsF ...

  8. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  9. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

随机推荐

  1. iOS多线程拾贝------操作巨人编程

    iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...

  2. C#- 实用的Log4Net日志记录例子

    工作中也是要用到日志记录的,LOG4NET在这块做的不错,以后可以继续拿来用. 1.引用DLL 2.LOG4NET的配置文件 <?xml version="1.0" enco ...

  3. 虚方法(virtual)和抽象方法(abstract)的区别

    注:本文转载自 http://www.cnblogs.com/michaelxu/archive/2008/04/01/1132633.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别 ...

  4. 设置 ubuntu ftp

    apt-get install后就是启动不了,ftp localhost connection refued 1. 关闭ubuntu防火墙 :  ufw disable 2. 还是不行,报 500 m ...

  5. DONET三层架构开发初步

    .NET三层架构开发初步 今天咱们来谈下三层架构.说到三层架构,搞过点程序的可能都知道三层架构的概念.但是对三层的精髓可能不是很了解. 首先说下自己对三层的理解,就是使用三个(多个)项目结合起来开发出 ...

  6. C#中提供的精准测试程序运行时间的类Stopwatch

    C#中提供的精准测试程序运行时间的类Stopwatch http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html 在需要对程序的执 ...

  7. Android硬件加速

    Android从3.0(API Level 11)开始,在绘制View的时候支持硬件加速,充分利用GPU的特性,使得绘制更加平滑,但是会多消耗一些内存. 开启或关闭硬件加速: 由于硬件加速自身并非完美 ...

  8. android123 zhihuibeijing 新闻中心-新闻 页签 ViewPagerIndicator实现

    ## ViewPagerIndicator ## 使用导入ViewPagerIndicator库的方式相当于可以改源码,打包编译Eclips可以自动完成. ViewPager指针项目,在使用ViewP ...

  9. STL——内存基本处理工具

    STL定义有五个全局函数,作用于未初始化空间上,这样的功能对于容器的实现很有帮助.前两个函数是用于构造的construct()和用于析构的destroy(),另三个函数是uninitialized_c ...

  10. MySQL之事务隔离级别--转载

    转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...