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

一,前期配置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. php 接收 Content-Type 是 application/json的请求数据

    工作中为其他公司编写了一个提供请求的接口,自己调试的时候是用form提交的,所以可以用$_POST取键接收方式,而对接联调的时候发现总是取不到数据,把$_POST整个序列化放入日志也是[] ,空的,于 ...

  2. Oracle- 存储过程和异常捕捉

    这段时间晚上有时候去打打球,回家看看电视剧,日子一天天过…….学了点ORACLE存储过程基础,作一下备注,以便日后需查阅. 创建无参存储过程 create procedure p_myPro1 is ...

  3. Struts中文件的上传与下载

    前面学到的用组件去上传 前台: 1.post表单提交 2.表单类型 multipart/form-data 3.intput type=file 后台: Apach提供的FileUpload组件 核心 ...

  4. iOS 时间戳转换为时间

    NSString *str=";//时间戳 NSTimeInterval time=[str doubleValue]+;//因为时差问题要加8小时 == 28800 sec NSDate ...

  5. Print2flash在.NET(C#)64位中的使用,即文档在线预览

    转:http://www.cnblogs.com/flowwind/p/3411106.html Print2flash在.NET(C#)中的使用,即文档在线预览   office文档(word,ex ...

  6. (源)V8 Engine 编译

    v8 engine编译 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  7. js 三元运算符以及|| 和 && 测试

    var  a = '0';var  b = a ? 'me':'hi'; console.log(b);//false 有: undefined , 0, '', false,null//true  ...

  8. C#_delegate - 异步调用实例 BeginInvoke EndInvoke event

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 【面试题】如何让C语言自动发现泄漏的内存

    1. 题目 改造malloc和free函数,使C语言能自动发现泄漏的内存,在程序退出时打印中遗漏的内存地址和大小. 2. 思路 用一个链表来记录已经分配的内存地址.在malloc时,把分配的内存地址和 ...

  10. extremeComponents(ec)源码分析

    eXtremeComponents(简称ec)是一系列提供高级显示的开源JSP定制标签,当前的包含的组件为eXtremeTable,用于以表形式显示数据. 其本质是jsp的自定义标签,抓住这一点就抓住 ...