php本地上传文件类
/**
* 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本地上传文件类的更多相关文章
- 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...
- XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地
使用XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地. 1.第一种方法是最常用的 :如果下载了Xshell和Xftp,Ctrl+Alt+F就可以选择文件的互传了!(虚拟机/云服务 ...
- PHP - FTP上传文件类
/** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...
- C# 通用上传文件类
1.Upfile.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="U ...
- CentOS7中利用Xshell6向虚拟机本地上传文件
环境交代 Linux系统:CentOS7, Xshell版本:6 操作步骤 下面我们以一个文件上传来演示用法 第一步 建立连接,这里不多说 在Xshell中点击如下图标,或者直接按 Alt+Ctrl+ ...
- xshell本地上传文件至服务器
今天本地写了个项目,想传到服务器部署起来.就上网百度了一下挺多的,一个个记录下,如有雷同,纯属抄袭. lrzsz方法 rz # 检查是否安装 yum -y install lrzsz # 安装 rpm ...
- PHP上传文件类 代码练习
类文件: <?php class upload{ protected $fileName; protected $uploadPath; protected $maxSize; protecte ...
- webview 本地上传文件
参考http://blog.csdn.net/zhtsuc/article/details/49154099 直接上代码 public class MainActivity1 extends Ac ...
- Hadoop HDFS编程 API入门系列之从本地上传文件到HDFS(一)
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs5; import java.io.IOException; import ja ...
- 本地上传文件至服务器的技巧(linux文件压缩及解压文件)
linux(ubuntu)文件解压及压缩文件 ubuntu支持文件的解压及压缩功能, 如果ubuntu上面没有安装过unzip工具的话,可以通过下面命令安装: sudo apt-get install ...
随机推荐
- electron-builder
electron-builder打包工具 首先,确保你的项目中已经安装了 electron-builder.可以在项目根目录下运行以下命令来安装它: npm install electron-buil ...
- Solon 框架启动为什么特别快?
思来想去!可能与 Solon 容器的独立设计有一定关系. 1.Solon 注解容器的运行特点 有什么注解要处理的(注解能力被规范成了四种),提前注册登记 全局只扫描一次,并在扫描过程中统一处理注解相关 ...
- LyScript 插件实现UPX寻找入口
LyScript 插件可实现对压缩壳的快速脱壳操作,目前支持两种脱壳方式,一种是运用API接口自己编写脱壳过程,另一种是直接加载现有的脱壳脚本运行脱壳. 插件地址:https://github.com ...
- 手撕红黑树 | 变色+旋转你真的明白了吗?【超用心超详细图文解释 | 一篇学会Red_Black_Tree】
说在前面 我们也很久没有更新数据结构系列了,半年前博主重新深入学习了红黑树这个数据结构,一直想更新呈现给大家,最近也一直没有时间,今天红黑树它来了! 博主为了这篇博客,做了很多准备,试了很多画图软件, ...
- https、UDP的加密原理,其它传输层的同理
总结: 1.若应用需要使用http协议,那么就直接使用 https + 购买证书的方式. 2.若项目需要使用udp协议(浏览器不支持udp,所以只能是客户端软件包含APP),那么就需要将公钥内置在AP ...
- .NET 云原生架构师训练营(模块二 基础巩固 Scrum 简介)--学习笔记
2.7.2 Scrum 简介 SCRUM 是什么 SCRUM 精髓 SCRUM 框架 角色 SCRUM 是什么 SCRUM 是迄今为止最著名的敏捷方法,主要用于开发.交付和持续支持复杂产品的一个框架, ...
- Linux--Vi编辑命令(跳到指定行、翻屏、缩进)
1.设置行号 如果编辑后,又想显示行号,同样操作按一下esc键,并输入:(冒号),输入set number ,并按回车键,完成后即显示行号. 不需要显示行号,同样操作按一下esc键,并输入:(冒 ...
- Java方法重载浅谈
Java方法重载浅谈 目录: 方法重载的定义 方法重载的满足条件 方法重载的传递 基本类型 引入类型 方法重载的好处 方法重载的定义以及满足条件: 定义: 方法重载指同一类中定义多个方法之间的联系: ...
- C# 二十年语法变迁之 C# 2,C# 3 ,C# 4参考
C# 二十年语法变迁之 C# 2,C# 3 ,C# 4参考 https://benbowen.blog/post/two_decades_of_csharp_i/ 自从 C# 于 2000 年推出以来 ...
- 竞态问题与RxJs
竞态问题与RxJs 竞态问题通常指的是在多线程的编程中,输入了相同的条件,但是会输出不确定的结果的情况.虽然Js是单线程语言,但由于引入了异步编程,所以也会存在竞态的问题,而使用RxJs通常就可以解决 ...