/**
* Class UploadFile
* @author fengzi
*/
class UploadFile
{
public $error = array(); //上传前的error信息
public $info = array(); //上传过程中的错误信息
protected $uploadType; //标识是单文件还是多文件上传
protected $files;       //上传的文件
protected $path;       //上传文件的新路径
public $maxsize = 8 * 1024 * 1024; //设置上传文件的大小
public $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf','docx', 'jpeg', 'pptx', 'mp4', 'avi', 'mpeg', 'xls', 'xlsx'); //默认允许用户上传的文件类型
public $save_info = array();     //上传成功后,返回一组有用信息 function __construct($files, $path, $size=0){
$this->path = $path;
$this->uploadType = $this->singleOrManyFile($files);
$this->maxsize = empty($size) ? 8 * 1024 * 1024 : $size * 1024 * 1024; if ( !$this->isError($files, $this->uploadType) ) {
return $this->error;
} $this->isPathExist();
} //上传文件
public function upload() {
$num = count($this->files['name']); for ($i=0; $i<$num; $i++) {
$name = $this->files['name'][$i];
$type = $this->files['type'][$i];
$tmp_name = $this->files['tmp_name'][$i];
$size = $this->files['tmp_name'][$i]; //判断上传文件有没有超过最大值
if ( !$this->checkSize($size) ) {
$this->setInfo($name, 'size');
continue;
} //获得随即文件名
$newFileName = $this->proRandName($name);
$new_path = $this->path.'/'.$newFileName; //判断上传类型是否正确
$ext = trim($this->getFileExt($name));
if ( !$this->checkFileType($ext) ) {
$this->setInfo($name, 'ext', $ext);
continue;
} //判断文件是否是通过 HTTP POST 上传的
if( !is_uploaded_file($tmp_name) ) {
$this->setInfo($name, 'tmp_name');
continue;
} //上传文件
if( !@move_uploaded_file($tmp_name, $new_path) ) {
$this->setInfo($name, 'move_uploaded_file');
continue;
} else {
//存储当前文件的有关信息,以便其它程序调用
$this->save_info[] = array(
"name" => $name,
"new_name" => $newFileName,
"ext" => $ext,
"mime_type" => $type,
"size" => $size,
"save_path" => $this->path,
);
}
}
} //获取上传成功后的信息
public function getSaveInfo() {
return $this->save_info;
} //获取上传中的错误信息
public function getInfo() {
return $this->info;
} //获取上传时的错误信息
public function getError() {
return $this->error;
} //记录上传过程中的错误
private function setInfo($name, $flag, $ext='') {
switch ($flag) {
case 'size':
$info = "上传文件超过了设置的最大值";
break;
case 'ext':
$str = implode(',', $this->allow_type);
$info = "上传的文件类型{$ext}不在{$str}中";
break;
case 'tmp_name':
$info = "文件不是通过 HTTP POST 上传的";
break;
case 'move_uploaded_file':
$info = "上传文件失败";
break;
} $array = array(
'filename' => $name,
'info' => $info,
);
$this->info[] = $array;
} //检查保存目录是否存在
private function isPathExist() {
if ( !file_exists($this->path) || !is_writable($this->path) ) {
@mkdir($this->path);
chmod($this->path, 0777);
}
} //判断是单文件还是多文件上传
private function singleOrManyFile($files) {
if ( is_array($files['name']) ) {
return 'many';
} else {
return 'single';
}
} //判断上传文件是否有错误
private function isError($files, $uploadType) {
if ( $uploadType == 'single' ) {
$this->files = array();
$this->files['name'] = array($files['name']);
$this->files['type'] = array($files['type']);
$this->files['tmp_name'] = array($files['tmp_name']);
$this->files['error'] = array($files['error']);
$this->files['size'] = array($files['size']);
} else {
$this->files = $files;
} $num = count($this->files['name']);
for ($i=0; $i<$num; $i++) {
if ( $this->files['error'][$i] > 0 ) {
switch ($this->files['error'][$i]) {
case 1:
$this->error[] = '文件大小超过了PHP.ini中的文件限制';
break;
case 2:
$this->error[] = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
break;
case 3:
$this->error[] = '文件部分被上传';
break;
case 4:
$this->error[] = '没有文件被上传';
break;
case 5:
$this->error[] = '服务器临时文件夹丢失';
break;
case 6:
$this->error[] = '文件写入到临时文件夹出错';
break;
case 7:
$this->error[] = '文件写入失败';
break;
case -1:
$this->error[] = '末充许的类型';
break;
case -2:
$this->error[] = '文件过大,上传的文件不能超过'.$this->maxsize.'个字节';
break;
case -3:
$this->error[] = '上传失败';
break;
case -4:
$this->error[] = '建立存放上传文件目录失败,请重新指定上传目录';
break;
case -5:
$this->error[] = '必须指定上传文件的路径';
break;
}
} else if( $this->files['size'][$i] > $this->maxsize) {
$this->error[] = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
}
} if ( !empty($this->error) ) {
return false;
} else {
return true;
}
} //判断上传文件是否为允许类型
private function checkFileType($ext) {
if ( in_array($ext, $this->allow_type) ) {
return true;
} else {
return false;
}
} //设置随机文件名
private function proRandName($name) {
$fileName = date('YmdHis')."_".uniqid().mt_rand(100000,999999); //获取随机文件名
return $fileName.'.'.$this->getFileExt($name); //返回文件名加原扩展名
} //获取文件后缀
private function getFileExt($name) {
$point = strripos(strtolower($name), '.');
$ext = substr($name, $point+1);
return $ext;
} //检测用户提交文件大小是否合法
private function checkSize($size) {
if ($size > $this->maxsize) {
return false;
} else {
return true;
}
}
}

php本地上传文件类的更多相关文章

  1. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。

    用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...

  2. XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地

    使用XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地. 1.第一种方法是最常用的 :如果下载了Xshell和Xftp,Ctrl+Alt+F就可以选择文件的互传了!(虚拟机/云服务 ...

  3. PHP - FTP上传文件类

    /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...

  4. C# 通用上传文件类

    1.Upfile.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="U ...

  5. CentOS7中利用Xshell6向虚拟机本地上传文件

    环境交代 Linux系统:CentOS7, Xshell版本:6 操作步骤 下面我们以一个文件上传来演示用法 第一步 建立连接,这里不多说 在Xshell中点击如下图标,或者直接按 Alt+Ctrl+ ...

  6. xshell本地上传文件至服务器

    今天本地写了个项目,想传到服务器部署起来.就上网百度了一下挺多的,一个个记录下,如有雷同,纯属抄袭. lrzsz方法 rz # 检查是否安装 yum -y install lrzsz # 安装 rpm ...

  7. PHP上传文件类 代码练习

    类文件: <?php class upload{ protected $fileName; protected $uploadPath; protected $maxSize; protecte ...

  8. webview 本地上传文件

    参考http://blog.csdn.net/zhtsuc/article/details/49154099 直接上代码   public class MainActivity1 extends Ac ...

  9. Hadoop HDFS编程 API入门系列之从本地上传文件到HDFS(一)

    不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs5; import java.io.IOException; import ja ...

  10. 本地上传文件至服务器的技巧(linux文件压缩及解压文件)

    linux(ubuntu)文件解压及压缩文件 ubuntu支持文件的解压及压缩功能, 如果ubuntu上面没有安装过unzip工具的话,可以通过下面命令安装: sudo apt-get install ...

随机推荐

  1. 使用C#做为游戏开发的服务器语言方案

    Scut开源服务器 开源C#/Python/Lua 手游服务器 主页:http://www.scutgame.com/index.html 开源:https://github.com/ScutGame ...

  2. 微信小程序-常用弹窗

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/ui/interaction/wx.showToast.html showToast ...

  3. C/C++ Qt 命令行版网络通信

    通常情况下Qt如果需要建立网络通信则必须依附于图形界面,但如果是新手入门,图形界面则显得太过于繁琐不利于学习原理,如下本人实现了命令行版本的网络通信案例,能够让读者更好的理解Qt是如何创建网络通信套接 ...

  4. AIX6.1系统NTP同步配置

    前言   当AIX系统的本地时间与时间服务器授出的标准时间误差大于±1000秒时.xntpd服务将无法同步时间并变得无法正常工作,请进行ntp配置前,先修改AIX系统的本地时间,尽量和时间服务器的标准 ...

  5. ARKit的理解与使用

    AR概述 AR的意义:让虚拟世界套与现实世界建立联系,并可以进行互动. AR的技术实现:通过实时地计算摄影机输出影像的位置及角度,并在内部通过算法识别将场景中的事物,然后在内部模拟的三维坐标系中给识别 ...

  6. CF911G Mass Change Queries 题解

    题目链接:CF 或者 洛谷 前置知识点:平衡树合并: CF文章 与维基百科 看上去这题有很多人用线段树分裂与合并去做,其实这种需要分裂和合并的,我们用文艺平衡树去维护区间信息是最容易写的. 考虑本题的 ...

  7. Adoquery 简单的事务 编程 超级棒

    1.记得 有一次 看 c#视频教程,发现了一个简单事务 处理的绝佳方法,就是 adoquery 其实是可以 同时执行多条 SQL 语句的, 当其中一条 SQL 语句失败了,那么其余 SQL 语句也会失 ...

  8. python-比较两个列表中的相同元素和不同元素

    由于两个列表(List)中可能会存在重复的元素,所以我们可以将列表转化成集合(set)进行去重,然后计算交集和差集. A = ['1','2','3'] B = ['2','4','5'] ##计算交 ...

  9. JS 保姆级贴心,从零教你手写实现一个防抖debounce方法

    壹 ❀ 引 防抖在前端开发中算一个基础但很实用的开发技巧,在对于一些高频操作例如监听输入框值变化触发更新之类,会有奇效.除了实际开发,在面试中我们也可能偶遇手写防抖节流的问题,鉴于不同公司考核要求不一 ...

  10. JS Leetcode 213. 打家劫舍 II 题解分析,在动态规划基础上感受分治算法的魅力

    壹 ❀ 引 本题来自LeetCode 213. 打家劫舍 II,难度中等,属于前面我们做过的198. 打家劫舍的升级版,难度同样为中等,题目描述如下: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内 ...