非常棒的文件上传类,共享一下
发布于:2022-01-17 09:50:54
#1 setlt
首先声明非本人原创,不过这个类的确不错,除了文件上传的基本功能,还可以产生缩略图及打水印等功能,经本人测试,可以结合speendPHP很简单的使用。喜欢的,可以试试。
uploadFile.rar
2009-12-24 21:45:06
#2 jake
很不错的一个上传类,同时还有缩放图形和水印功能,是非常优良的一个扩展类。
感谢楼主的分享!
2009-12-24 22:51:58
#3 daing
注释很详细,可还是不知道怎么用?
楼主能举例说明吗?
一定做到物尽其用!!!
2009-12-25 08:46:01
#4 setlt
谢谢支持,可以先仔细研究一下,个人感觉还是很有实用价值的。晚点举个简单的实例,我们一块学习,呵!
2009-12-25 09:00:27
#5 gudufy
非常不错,希望写个使用教程上来,谢谢。
2009-12-25 15:04:25
#6 setlt
其实使用起来,很简单。下面就上传的使用举个简单的例子,这里是结合speedPHP使用的。
1、简单配置一下,可以使用外部类。
我这边是在项目目录下新建了一个plug文件夹用于放置外部类文件,把下载的uploadFile.php文件放到plug文件夹中。在index.php配置文件中配置:
'include_path'=>array( APP_PATH.'/plug',),这样就可以在控制器类里面直接使用import('uploadFile.php');2、新建控制器ToolBox(名字随意,保证类名和文件名一直),书写代码如下:
import("uploadFile.php");
class ToolBox extends spController {
//上传类测试
function upFile(){
$this->title='文件上传';
if($this->spArgs('up')){
$upFlie=new uploadFile();
$result=$upFlie->upload_file($_FILES['upfile']);
$msg=$upFlie->errmsg;
if($result){
$this->success=$msg;
}else {
$this->errmsg=$msg;
}
}
}
}
?>
就这么简单的几行代码,就可以了,当然还要一个视图文件。
3、建立视图。
细心的你可能会发现我上面的控制器中没有使用$this->display();语句,其实我是使用了sp强大的自动页面输出功能,当然在使用前要先配置一下,在配置文件中
'view'=>array(
'auto_display'=>true,
),这样简单的配置就可以了。模板内容如下:
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml">
{$title}
{$title}
{if $success}
{$success} 继续上传返回项目首页
{elseif $errmsg}
{$errmsg} 重新上传
{else}
上传功能就这样简单的实现了,当然这个类里面的其他功能使用方法同理,不过你可能要先熟悉一下这个类了。有问题请跟帖。把现成的示例文件传上来吧,可以参考一下。压缩包里面的一些其他文件是个人练习使用的,偷懒一下,没有删除。speed.rar里面index.php是我本地的配置,要想正常运行还要根据实际情况在配置。
2009-12-25 16:18:28
#7 jake
感谢 setlt 朋友的教程!
这里补充一下,由于预设了“'include_path'=>array( APP_PATH.'/plug',),” 的路径
因为spClass本身就是通过import来获取类的。
所以在使用上不需要import了,可以直接用
$upFlie=spClass(“uploadFile”);
是可以替代:
import("uploadFile.php");
$upFlie=new uploadFile();
-----
PS:sp团队以后将定期的挑选一些比较好的扩展类,作为sp框架默认的扩展类进行发布。希望大家更踊跃提供如楼主一样的优良的扩展类。
2009-12-25 17:52:13
#8 setlt
感谢楼上的指点,看来要好好研究一下源码了,:)
2009-12-25 20:53:09
#9 zhangcjl
:P:lol:D:victory:up up up
2010-01-02 17:24:21
#10 vsxp
好东西,感谢分享。
2010-01-03 01:13:30
#11 dengfeng
支持下楼主~~
2010-01-18 16:32:42
#12 xieguolun
为何不弄个上传图片的呢?
2010-02-16 23:59:08
#13 jake
为何不弄个上传图片的呢?
xieguolun 发表于 2010-2-16 23:59 
该上传类有包括文件上传,还有图片上传等相关功能的,可以仔细看看代码内注释。
2010-02-18 19:33:57
#14 lpzxqsw
谢谢分享 下载了
2010-02-21 20:24:30
#15 stalker
我看到的怎么是乱码?
2010-02-23 12:26:45
#16 shinid8210
感谢 setlt 朋友的教程!
这里补充一下,由于预设了“'include_path'=>array( APP_PATH.'/plug',),” 的路 ...
jake 发表于 2009-12-25 17:52 
class ToolBox extends spController {
function index(){
$this->title='工具箱';
}
//上传类测试
function upFile(){
$this->title='文件上传';
if($this->spArgs('up')){
$upFlie=spClass('uploadFile');
$result=$upFlie->upload_file($_FILES['upfile']);
$msg=$upFlie->errmsg;
if($result){
$this->success=$msg;
}else {
$this->errmsg=$msg;
}
}
}
}
?>
我这样写 为什么 上传的文件直接到d盘根目录呢,如果用楼主的那种方法 可以上传到网站的upload目录。也就是说直接用spClass('uploadFile'); 上传类里面的$save_path = './upload/', 这个变量获取不到值。望斑竹教我一下。我是刚学的
2010-03-01 22:55:49
#17 jake
看看upload类的构造函数
__construct($save_path = './upload/',$file_name = 'date',$allow_types = '')
可以通过构造函数来设置$save_path保存路径。
这里可以通过spClass的第二个参数来进行带参数的类初始化
$arg = array(
'D:/upload/web',
'date'
);
spClass("uploadFile", $arg); // 注意第二个参数是数组
http://speedphp.com/manual/spclass
2010-03-02 08:55:50
#18 shinid8210
谢谢斑竹的回复,斑竹非常负责,赞一个
2010-03-03 13:50:55
#19 meidea
正需要呢!
2010-03-20 18:25:55
#20 jungleeye
PS:sp团队以后将定期的挑选一些比较好的扩展类,作为sp框架默认的扩展类进行发布。希望大家更踊跃提供如楼主一样的优良的扩展类。
jake 发表于 2009-12-25 17:52 
感谢+支持!
2010-03-28 11:34:58
#21 shinid8210
看看upload类的构造函数
__construct($save_path = './upload/',$file_name = 'date',$allow_types = '')
...
jake 发表于 2010-3-2 08:55 
$uparray=array('./upload/','date');
$upFlie=spClass('uploadFile',$uparray);
按照 jake的 那样说明来上传。上传成功后会出现
文件Array/20100401231553.jpg上传成功!
就是说 数组值并未传过去。是什么原因呢
2010-04-01 23:17:44
#22 jake
$uparray=array('./upload/','date');
$upFlie=spClass('uploadFile',$uparray);
按照 jake的 ...
shinid8210 发表于 2010-4-1 23:17 
用new来替代spClass,因为spClass限制了类的构造函数仅能有一个参数输入。
2010-04-02 11:16:43
#23 snllll
回复 23 jake 困惑!那到底$upFlie=spClass(“uploadFile”);是能用还是不能用?怎么用!?
2010-04-22 21:41:59
#24 sevil
上传.rar一个上传后返回文本框的例子。
2010-04-28 13:39:05
#25 snllll
回复 25 sevil 非常好!思路 很经典很实用!谢了~ 呵呵
2010-05-19 23:53:35
#26 redguan
与SP结合不好,需要修改些地方才能使用。
2010-05-21 14:53:44
#27 redguan
uploadFile.zip原来的不太好用,稍稍修改了一下。
但还有很多不如意的地方,有空再重写。
一、构造函数的修改
public function __construct($upconfig) {
$this->file_name = $upconfig['filename'] ? $upconfig['filename'] : 'date';//重命名方式代表以时间命名,其他则使用给予的名称
$this->save_path = (preg_match('/\/$/',$upconfig['filepath'])) ? $upconfig['filepath'] : $upconfig['filepath'] . '/';
$this->allow_types = $upconfig['filetype'] ? $upconfig['filetype'] : 'jpg|gif|png|zip|rar' ;
$this->max_size = $upconfig['filesize'] ? $upconfig['filesize'] : 2048000 ;
}
二、上存类的修改
public function upload_file($files) {
$name = $files['name'];
$type = $files['type'];
$size = $files['size'];
$tmp_name = $files['tmp_name'];
$error = $files['error'];
switch ($error) {
case 0 : $this->errmsg = '';
break;
case 1 : $this->errmsg = '超过了php.ini中文件大小';
break;
case 2 : $this->errmsg = '超过了MAX_FILE_SIZE 选项指定的文件大小';
break;
case 3 : $this->errmsg = '文件只有部分被上传';
break;
case 4 : $this->errmsg = '没有文件被上传';
break;
case 5 : $this->errmsg = '上传文件大小为0';
break;
default : $this->errmsg = '上传文件失败!';
break;
}
if($error == 0 && is_uploaded_file($tmp_name)) {
//检测文件类型
if($this->check_file_type($name) == FALSE){
return FALSE;
}
//检测文件大小
if($size > $this->max_size){
$this->errmsg = '上传文件'.$name.'太大,最大支持'.ceil($this->max_size/1024).'kb的文件';
return FALSE;
}
$this->set_save_path();//设置文件存放路径
if($this->file_name=='date'){
$new_name = date('YmdHis').'.'.$this->ext;//设置新文件名
}elseif($this->file_name=='md5'){
$new_name = md5(time().$name).'_'.time().'.'.$this->ext;//设置新文件名
}else{
$new_name = $this->file_name.'.'.$this->ext;
}
$this->uploaded = $this->save_path.$new_name;//上传后的文件名
//移动文件
if(move_uploaded_file($tmp_name,$this->uploaded)){
$this->errmsg = '文件'.$this->uploaded.'上传成功!';
return array('nn'=>$new_name,'fs'=>$size,'ft'=>$type,'fn'=>$name);
}else{
$this->errmsg = '文件'.$this->uploaded.'上传失败!';
return FALSE;
}
}
}
使用方法:
function upload(){
/* 或者放在CONFIG,然后通过spExt 调用 */
$upconfig = array(
'filename'=> 'md5', //文件名类型 (date|md5)
'filepath'=> './attach/', //文件目录
'filesize'=> '1024000', //文件最大
'filetype'=> 'jpg|jpeg|gif|png', //文件类型
);
$fileinfo = spClass('uploadFile',$upconfig)->upload_file($_FILES['fileinfo']);
if (is_array($fileinfo)){
dump($fileinfo);
//$fileinfo 信息入库操作 略~~~~~~
$this->error('已上存',spUrl('pic', 'index'));
}else{
$this->error('上存失败',spUrl('pic', 'index'));
}
}
2010-05-21 15:39:55
#28 redguan
修改目的:
入口更明确,调用更方便。
增加一个返回函数。将信息进行后续处理,(将附件数据入库操作)
还有不如意的地方:
1、无法批量上存,需要依赖于外部循环。
2、图片水印、綋略图不尽人意。
3、与SP结合不够。例如遍历函数可以使用SP的,而不需要重写。
2010-05-21 15:43:24
#29 ry.china
关于图片缩略图的功能,研究了一下,
import(APP_PATH.'/include/uploadFile.php');//这里必须要配引用因为这里面两个类
/**
* 文件上传
*/
function upFile(){
if($this->spArgs('up')){
$uploadFile = new uploadImg();
$mypath = 'upload/'.date('Y-m-d');
$uploadFile->save_path = $mypath;
$uploadFile->dst_path = $mypath.'/min';
$uploadFile->mark_ttf = './yahei_mono.ttf';
$uploadFile->mark_str = '测试测试测试测试';
$result = $uploadFile->upload_file($_FILES['upfile']);
$msg = $upFlie->errmsg;
if($result){
$temp = $uploadFile->uploaded;
$uploadFile->img_mark(null, 2);//添加水印文字
$uploadFile->img_resized(100,120);//生成小图
$photo=spClass('photo');
$conditions = array('baseinfoid'=>$_SESSION['userid'], 'imgurl'=>$uploadFile->uploaded,'imgurl_min'=>$uploadFile->get_smallimgurl(),'size'=>$_FILES['upfile']['size'], 'isicon'=>0, 'isapprove'=>0, 'uploaddate'=>time());
if($photo->create($conditions)){
header('Location: index.php?c=photos&a=index');
}
}else {
$this->errmsg=$msg;
echo 'error';
}
}
}
get_smallimgurl()这个方法是返回dst_name的值,可以将这个属性更改为public 的也行
2010-06-01 22:10:29
#30 hr123456
多谢分享了,好东西啊。。。
2010-06-26 12:56:37
#31 aoyoo
真是太棒了,我看了都兴奋的发狂了
2010-07-25 15:57:10
#32 billgame
$uparray=array('./upload/','date');
$upFlie=spClass('uploadFile',$uparray);
按照 jake的 ...
shinid8210 发表于 2010-4-1 23:17 
应该为:
$upFlie=spClass('uploadFile',$uparray[0]);
我这样用,成功了。
2010-08-02 16:43:16
#33 misty_wxq
不错不错,谢谢分享!
2010-08-04 11:21:51
#34 okbb
缩放的例子有吗,是剪裁,还是简单原图放大缩小。。。
2010-08-18 20:30:53
#35 yuanjianhua
回复 30 ry.china 你好!
$uploadfile = spClass('uploadImg');我这样写,报
uploadImg类定义不存在,请检查。
怎么解决呢?我的上传类放在SpeedPHP的Extensions里面
2010-08-19 22:57:25
#36 xpp1000
运行不了呀,摆脱搞完整一点,发布前检查一下,一堆错误。Warning: require(SP_PATH/SpeedPHP.php) [function.require]: failed to open stream: No such file or directory in D:\www\sp_img\speed\index.php on line 16
Fatal error: require() [function.require]: Failed opening required 'SP_PATH/SpeedPHP.php' (include_path='.') in D:\www\sp_img\speed\index.php on line 16
2010-09-25 10:28:24
#37 cygsd
不错的扩展类。只是示例文件中有个别错误需要修改,比如:双引号用了中文引号,模板文件中缺少“{/if}”,保存路径也有问题,需加上“APP_PATH”等等。
试用了一下,很好,准备应用到自己的项目中去。
试验成功的代码如下:
1、下载28楼的uploadFile.php文件,复制到网站根目录下面的plug文件夹中。
2、spConfig.php中添加如下代码:
'include_path' => array(
APP_PATH.'/include',
APP_PATH.'/plug',
), // 用户程序扩展类载入路径
3、控制器文件touxiang.php:
class touxiang extends spController {
//上传类测试
function upFile(){
$this->title="文件上传";
if($this->spArgs("up")){
$uparray=array('filepath'=>APP_PATH . '/images/touxiang','filename'=>'date');
$upFlie=spClass("uploadFile",$uparray);
$result=$upFlie->upload_file($_FILES["upfile"]);
$msg=$upFlie->errmsg;
if($result){
$this->success=$msg;
$this->newname=$result["nn"];
}else {
$this->errmsg=$msg;
}
}
}
}
4、模板文件upFile.html:
{$title}
{$title}HELLO
{if $success}
{$success} 继续上传
{elseif $errmsg}
{$errmsg} 重新上传
{else}
{/if}
2010-12-08 00:01:53
#38 mir3000
可以断点续传?
2010-12-17 19:33:34
#39 cisway
function upFile(){
$this->title='文件上传';
if($this->spArgs("up")){
$uparray=array('filepath'=>APP_PATH . '/themes/uploads/','filename'=>'date');
$upFlie=spClass("uploadFile",$uparray);
$result=$upFlie->upload_file($_FILES["upfile"]);
$msg=$upFlie->errmsg;
if($result){
//dump($result); //输出上传成功的返回值 'nn'=>new_name,'fs'=>$size,'ft'=>$type,'fn'=>$name
$this->success = $msg;//赋值给模版成功提示
$this->newname = $result["nn"];//赋值上传成功文件名。
$this->pic_path = "/themes/uploads/".date('Ym').'/'.$this->newname;
//echo "";
}else {
$this->errmsg = $msg;
}
}
$this -> display('test/adupfile.html');
上面是
http://localhost/test.php?c=main&a=upFile如果我用iframe 调用上面文件
即
如何将上传图片的ID,也就是$this->pic_path发送到嵌套iframe这个页面而写入数据库?
下面是'test/adupfile.html模版页
<{$title}>
<{if $success}>
<{$pic_path}>文件上传成功

<{elseif $errmsg}>
<{$errmsg}> 重新上传
<{else}>
<{/if}>
2011-01-22 22:57:01
#40 soseek
好好,学习了
2011-01-23 03:49:58
#41 steptt
我的情况和26楼shinid8210一样,上传的文件直接到了d:\下。即使按照17楼jake说的那样也不行,好像构造函数没有运行一样。
2011-02-08 22:20:42
#42 steptt
我的情况和26楼shinid8210一样,上传的文件直接到了d:\下。即使按照17楼jake说的那样也不行,好像构造函数没有运行一样。
2011-02-08 22:21:04
#43 依然waiting
:victory:非常感谢
2011-07-14 16:28:36
#44 lin1400
也是在D盘 是不是哪里错了 求指教
2011-07-17 19:20:18
#45 lin1400
$uparray=array('filepath'=>APP_PATH.'/tpl/admin/img','filename'=>'date');
echo $uparray['filepath'];
输出 F:\APMServ5.2.6\www\htdocs\donglinsi/tpl/admin/img
$upFlie=spClass("uploadFile",$uparray);
echo $upFile->save_path;
输出 /
就是save_path 是F盘
用的是28楼的那个修改的
2011-07-17 19:26:17
#46 霸气千秋
没有专门地方来方扩展类库的啊,这样好找耶:lol
2011-07-19 11:59:58
#47 xiaozisha
我试着做了,但怎么上传了接下来怎么进行水印,还有在网页中怎么调用啊,俺是新手,还请各位帮帮忙
2011-07-21 11:27:20
#48 xiaozisha
我试着做了,但怎么上传了接下来怎么进行水印,还有在网页中怎么调用啊,俺是新手,还请各位帮帮忙
2011-07-21 11:28:10
#49 anythink
回复 49 xiaozisha 找我发的那个
2011-07-22 11:20:42
#50 lhabc
感觉好乱,最终版是哪个?怎么使用.目前还搞不清楚
2011-08-22 19:58:36
#51 sephiroth
补充一下,关于上传图片后保存在XX盘根目录下的的问题
$upconfig = array("filepath"=>APP_PATH . "/uploads/brandLogo","filename"=>"date");
改成
$upconfig = array('filepath'=>APP_PATH . '/uploads/brandLogo','filename'=>'date');
我是成功了,大家不妨试试
2011-10-25 15:47:36
#52 lijian
我的上面显示了上传成功,但是怎么就是没文件呢?
2011-11-16 11:17:25
#53 xim
这个上传类好像对exe文件检测不了
2011-11-18 14:44:12
#54 xim
有谁发现这个上传类对exe文件类型检测不出来吗,我上传exe文件时没有反应
2011-11-18 14:50:06
#55 刘钢
借鉴了,非常好用 {:soso_e179:}
2012-02-29 09:14:25
#56 心雨@心语
我也需要,那得好好看看了。
2012-08-30 23:49:57
#57 一生三做
得花一些时间来研究一下才行了
2013-01-22 17:44:17
#58 suxiaojack
{:soso_e102:}好东西,谢谢
2013-03-20 22:16:51
#59 ㊣〇
不错的,谢谢楼主分享
2013-06-22 12:51:01
#60 @_Life
几年了依然是好东西,谢谢分享
2013-10-12 13:30:16
#61 bxhcsz
我用speedphp和dwz框架结合起来以后,上传就失败呢。
特意做了测试模板和方法,不在dwz框架下就很正常,郁闷死我了
2013-10-22 13:36:32
#62 通和bruce
我试过了,咋不能用啊。
2014-08-13 16:57:37
#63 lvqing
jake 老大,spClass 实例化类时,需要传入初始参数时,应该怎么写?一直找不到例子
2015-02-27 17:22:14
#64 jake
spClass("类名", array("参数1", "参数2",))
参数不管多少个,都必须放到数组里面
2015-02-27 17:36:54
#65 lvqing
谢谢,这样扩展库的使用就能非常规范化了,能最充分利用框架
2015-02-28 11:08:20
#66 diannao580
能传多个文件吗
2015-08-02 09:43:01
#67 527802614
感谢分享,:loveliness::loveliness:此文件不能用于根目录
2016-03-03 21:56:35
#68 SHI
额!!!
2016-05-16 14:25:18