PHP5+UTF8多文件上传类


Posted in PHP onOctober 17, 2008

还有些功能没有加上去,如自动更名,图片处理等.可根据需要自己添加.
USE:
$up = new upfile(ROOT_PATH.'data/'.date("Ym",time()),array('gif','jpg','jpeg'),true);
$fileimg = $up->upload($_FILES['img']);//返回上传后文件名数组,$_FILES['img']为上传的文件
可使用$up->log查看上传时信息.
<?php
//====================================================
// FileName: upfile.class.php
// Summary: 文件上传类
// Author: millken(迷路林肯)
// LastModifed: 2008-6-4
// copyright (c)2008 millken@gmail.com
//====================================================
if(!defined('OK'))exit(__FILE__.'Access Denied');
class upfile {
public $ExtensionFileFormat = array();
public $returninfo = array();
private $ImageFileFormat = array('gif','bmp','jpg','jpe','jpeg','png');
private $OtherFileFormat = array('zip','pdf','rar','xls','doc','ppt','csv');
private $savePath;
private $attachment_path = './upfiles/';
private $overwrite = false; # 同名时是否覆盖
private $maxSize = 0; # 文件最大字节,为0时不限制大小
private $ext;
private $errno = 0;
/* 构造函数
* (string)$savePath 文件保存路径,默认为$attachment_path
* (array)$extensionFileFormat 自定义上传文件的扩展名,未设置时为$ImageFileFormat || $OtherFileFormat
* (bool)$overwrite 是否覆盖同名文件
*/
public function __construct($savePath='',$extensionFileFormat = array(),$overwrite = false) {
$this->savePath = empty($savePath)?$this->attachment_pathsavePath.'/';
$this->extensionFileFormat = is_array($extensionFileFormat)?$extensionFileFormat:array();
$this->overwrite = is_bool($overwrite)?$overwrite:false;
}
/*上传函数
* (array)$files 待上传的文件数组$_FILES['attach']
* (number)$maxSize 文件的最大字节数,默认为0不限制上传大小
*/
public function upload($files,$maxSize=0) {
$this->maxSize = is_numeric($maxSize)?$maxSize:0;
if(isset($files) && is_array($files)) {
if(is_array($files['name'])) {
foreach($files as $key => $var) {
foreach($var as $id => $val) {
$attachments[$id][$key] = $val;
}
}
} else {
$attachments[] = $files;
}
}
self::check_file_type($attachments);
if(empty($this->filelist)) {
$this->log .= "待上传的文件列表为空。\n";
return array();
}
if(!self::makeDirectory() || !@is_writable($this->savePath)) {
$this->log .= $this->savePath . "不能创建或其权限为不可写。\n";
return array();
}
$filearray = array();
foreach($this->filelist as $k=>$f) {
if($this->maxSize && $f['size']>$this->maxSize) {
$this->log .= $f['name'] . "其大小超过了设定的值:" . $this->maxSize ."\n";
}elseif($this->overwrite == false && file_exists($this->savePath . $f['name'])) {
$this->log .= $f['name'] . "已经存在于目录:" . $this->savePath . "\n";
}else{
@unlink($this->savePath . $f['name']);
if(@move_uploaded_file($f['tmp_name'],$this->savePath . mb_convert_encoding($f['name'],'gbk','utf-8'))) {//如果不进行编码转换,中文将无法支持
$this->log .= $f['name'] . "成功上传到目录:". $this->savePath ."\n";
$filearray[$k] = $this->savePath . $f['name'];
}else{
$this->log .= $f['name'] . "上传失败。\n";
}
}
}
return $filearray;
}
/*检测文件的类型
*(array)$files 文件数组
*/
private function check_file_type($files) {
$this->filelist = array();
foreach($files as $key=>$file) {
if($file['error'] == 0) {
$ext = strtolower(substr($file['name'], strrpos($file['name'], '.') + 1));
$str = @file_get_contents($file['tmp_name'],FALSE,NULL,0,20);
if((in_array($ext,array('jpg','jpeg')) && substr($str ,0, 3) !== "\xFF\xD8\xFF") || ($ext == 'gif' && substr($str ,0, 4) !== 'GIF8') || ($ext == 'png' && substr($str ,0, 8) !== "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") || ($ext == 'bmp' && substr($str ,0, 2) !== 'BM') || ($ext == 'swf' && (substr($str ,0, 3) !== 'CWS' || substr($str ,0, 3) !== 'FWS')) || ($ext == 'zip' && substr($str ,0, 4) !== "PK\x03\x04") || ($ext == 'rar' && substr($str ,0, 4) !== 'Rar!') || ($ext == 'pdf' && substr($str ,0, 4) !== "\x25PDF") || ($ext == 'chm' && substr($str ,0, 4) !== 'ITSF') || ($ext == 'rm' && substr($str ,0, 4) !== "\x2ERMF") || ($ext == 'exe' && substr($str ,0, 2) !== "MZ") || (in_array($ext,array('doc','xls','ppt')) && substr($str ,0, 4) !== "\xD0\xCF\x11\xE0")) {
$this->log .= $file['name'] . "文件类型与文件内容不符合。\n";
}elseif((!empty($this->extensionFileFormat) && in_array($ext,$this->extensionFileFormat)) || (empty($this->extensionFileFormat) && (in_array($ext,$this->ImageFileFormat) || in_array($ext,$this->OtherFileFormat)))) {
$this->filelist[$key] = $file;
}else{
$this->log .= $file['name'] . "不符合上传文件的类型。\n";
@unlink($file['tmp_name']);
}
}
}
}
/*生成上传目录
*
*/
private function makeDirectory() {
$directoryName = str_replace("\\","/", $this->savePath);
$dirNames = explode('/', $directoryName);
$total = count($dirNames);
$temp = '';
for($i=0; $i<$total; $i++)
{
$temp .= $dirNames[$i].'/';
if (!is_dir($temp))
{
$oldmask = @umask(0);
if (!@mkdir($temp, 0777)) return false;
@umask($oldmask);
}
};
if(is_dir($this->savePath)) {
return true;
} else {
return false;
};
}
}
?>

PHP 相关文章推荐
PHP动态变静态原理
Nov 25 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
比较时间段一与时间段二是否有交集的php函数
May 31 PHP
php中长文章分页显示实现代码
Sep 29 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
php实现的数字验证码及数字运算验证码
Jul 30 PHP
php中时间函数date及常用的时间计算
May 12 PHP
php实现socket推送技术的示例
Dec 20 PHP
Yii2 中实现单点登录的方法
Mar 09 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 #PHP
PHP中str_replace函数使用小结
Oct 11 #PHP
php preg_match_all结合str_replace替换内容中所有img
Oct 11 #PHP
php email邮箱正则
Oct 08 #PHP
php获取地址栏信息的代码
Oct 08 #PHP
Cannot modify header information错误解决方法
Oct 08 #PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 #PHP
You might like
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
两个DIV等高的JS的实现代码
2007/12/23 Javascript
很可爱的输入框
2008/08/03 Javascript
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python实现simhash算法实例
2014/04/25 Python
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
python实现共轭梯度法
2019/07/03 Python
python 日期排序的实例代码
2019/07/11 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
2014年廉洁自律承诺书
2014/05/26 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
新党章心得体会
2014/09/04 职场文书
离婚案件上诉状
2015/05/23 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python