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

一,前期配置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. win32多线程学习总结:同步机制critical sections

    Critical sections是win32中最容易使用的同步机制,用来处理一份共享资源,共享资源指的是每次只能够被一个线程处理的资源,包括内存.数据结构.文件等. 优点: 1.使用便捷,即声明即使 ...

  2. <meta 标签的详细使用

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta   标签的用处很多.meta  的属性有两种:na ...

  3. SQL Server重建索引计划

    每周日2点进行”一致性检查“ 每周六1点进行”重建索引“,重建索引会自动完成更新统计信息操作

  4. RefernceError : jQuery is not define

    使用ligerUI 的时候,代码没有什么错误,可是不能正常显示组件 ,火狐debug显演示样例如以下错误: 最后发现是引入文件的顺序错了,最好依照ligerui demo中的顺序引入js文件,这样就不 ...

  5. memset函数具体说明

    1.void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.样例#include void main(){char ...

  6. Android GridView 添加 网格线解决办法

    在使用 GridView 网格布局时,默认情况下 GridView  是没有网格线的,但是有些时候我们需要让GridView显示分割线,怎么办呢?查了不少资料,找到了一种为GridView添加网格线的 ...

  7. stap-prep 需要安装那些内核符号

    [root@server-mysql ~]# Need to install the following packages:kernel-debuginfo-2.6.32-279.el6.x86_64 ...

  8. log_slave_updates在线修改

    http://planet.mysql.com/entry/?id=20450 mysql> show variables like 'log_slave_updates'; +-------- ...

  9. 微软雅黑字体IE6 opacity改变,字体会变样子

    微软雅黑字体IE6 opacity改变,字体会变样子,换个字体就好了

  10. QT5中如何自定义窗口部件

    提升法 eg.(定义一个新的QLable部件)1.定义一个类class Label : public base, public QLabel //可以支持多重继承2.在qt creator中打开ui编 ...