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 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
从网上搜到的phpwind 0day的代码
Dec 07 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
php+mysql数据库查询实例
Jan 21 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
学习PHP的数组总结【经验】
May 05 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
PHP快速排序quicksort实例详解
Sep 28 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
PHP数组去重的更快实现方式分析
May 09 PHP
PHP中有关长整数的一些操作教程
Sep 11 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 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
德生PL330的评价与改造
2021/03/02 无线电
php4的彩蛋
2006/10/09 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
PHP生成条形图的方法
2014/12/10 PHP
Symfony生成二维码的方法
2016/02/04 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
VUE重点问题总结
2018/03/19 Javascript
一个因@click.stop引发的bug的解决
2019/01/08 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
Django 自定义分页器的实现代码
2019/11/24 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
资深生产主管自我评价
2013/09/22 职场文书
学习交流会主持词
2014/04/01 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
节能标语大全
2014/06/21 职场文书
中专生自荐信
2014/06/25 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
职工年度考核评语
2014/12/31 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书