非常棒的文件上传类,共享一下

#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

lvqing 发表于 2015-2-27 17:22
jake 老大,spClass 实例化类时,需要传入初始参数时,应该怎么写?一直找不到例子 ...
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