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 相关文章推荐
服务器端解压缩zip的脚本
Dec 22 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
PHP生成数组再传给js的方法
Aug 07 PHP
ThinkPHP的MVC开发机制实例解析
Aug 23 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
php编程每天必学之验证码
Mar 03 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php数据库密码的找回的步骤
2011/01/12 PHP
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
JavaScript在IE和FF下的兼容性问题
2014/05/19 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
vue实现侧边栏导航效果
2019/10/21 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
印度购买眼镜和太阳镜网站:Coolwinks
2018/09/26 全球购物
一道Delphi上机题
2012/06/04 面试题
体育专业自荐书
2014/05/29 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
停课通知书
2015/04/24 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
六年级作文之关于梦
2019/10/22 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
Python实现单例模式的5种方法
2021/06/15 Python
springBoot基于webSocket实现扫码登录
2021/06/22 Java/Android
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python