源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

phpcms模块开发之swfupload的使用介绍

  • 时间:2021-12-25 23:33 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:phpcms模块开发之swfupload的使用介绍
正式接触phpcms模块开发后.开发了几个功能模块.其中遇到了需要批量上传图片的问题.于是开始挖掘phpcms里面的swfupload的用法. 在phpcms里面自带的内容类型里面能够直接指定图片组.不过这样的图片组功能并不是我想用的.我需要上传一整个静态的html文件.需要 能够找到一个方法上传整个文件夹.并且能够保留原来的文件名称. [b]目的总结如下:[/b] [b]1,不改变系统的文件和目录结构.[/b] [b]2,实现多附件上传功能.[/b] [b]3,能够得到上传后的文件夹名称.[/b] 在phpcms中自带了附件上传的功能.我想去用swfupload功能,而这个功能被phpcms的附件上传功能集成进去了.那我要做的就是抽出来并加以修改. [b]第一步,我来研究研究这个是怎么调用的.[/b] 首先,打开firefox浏览器的firebug   打开网络面板.找到phpcm中swfupload呗调出的那个按钮.看看系统是请求的什么连接.
[url=<?php echo JS_PATH?>swfupload/swfupload.css]<script language="JavaScript" type="text/javascript" src="<?php echo JS_PATH?>swfupload/swfupload.js"></script> <script language="JavaScript" type="text/javascript" src="<?php echo JS_PATH?>swfupload/fileprogress.js"></script> <script language="JavaScript" type="text/javascript" src="<?php echo JS_PATH?>swfupload/handlers2.js"></script> <script type="text/javascript"> <?php echo initupload($_GET['module'],$_GET['catid'],$args,$this->userid,$this->groupid,$this->isadmin)?> </script>
首先是引入了头文件.我大概看里一下.里面有jquery什么的.是必要文件.所以一会我们要用的时候也要引入这个头. 之后是swfupload的样式文件和必要的JS.这里调用了一个系统函数initupload,这个函数到底是干嘛的. 千万别小觑这行.整个swfupload的配置都在这里了. 我们去找找看这个函数. 在phpcms/modules/attachment/functions/golable.func.php里面找到了它的踪迹.代码如下,这个函数的主要作用就是配置swfupload这个插件.
/* flash上传初始化      * 初始化swfupload上传中需要的参数      * @param $module 模块名称      * @param $catid 栏目id      * @param $args 传递参数      * @param $userid 用户id      * @param $groupid 用户组id      * @param $isadmin 是否为管理员模式      */     function initupload($module, $catid,$args, $userid, $groupid = '8', $isadmin = '0'){         $grouplist = getcache('grouplist','member');         if($isadmin==0 && !$grouplist[$groupid]['allowattachment']) return false;         extract(getswfinit($args));         $siteid = param::get_cookie('siteid');         $site_setting = get_site_setting($siteid);         $file_size_limit = $site_setting['upload_maxsize'];         $sess_id = SYS_TIME;         $swf_auth_key = md5(pc_base::load_config('system','auth_key').$sess_id);         $init =  'var swfu = \'\';         $(document).ready(function(){         swfu = new SWFUpload({             flash_url:"'.JS_PATH.'swfupload/swfupload.swf?"+Math.random(),             upload_url:"'.APP_PATH.'index.php?m=attachment&c=attachments&a=swfupload&dosubmit=1",             file_post_name : "Filedata",             post_params:{"SWFUPLOADSESSID":"'.$sess_id.'","module":"'.$module.'","catid":"'.$_GET['catid'].'","userid":"'.$userid.'","siteid":"'.$siteid.'","dosubmit":"1","thumb_width":"'.$thumb_width.'","thumb_height":"'.$thumb_height.'","watermark_enable":"'.$watermark_enable.'","filetype_post":"'.$file_types_post.'","swf_auth_key":"'.$swf_auth_key.'","isadmin":"'.$isadmin.'","groupid":"'.$groupid.'"},             file_size_limit:"'.$file_size_limit.'",             file_types:"'.$file_types.'",             file_types_description:"All Files",             file_upload_limit:"'.$file_upload_limit.'",             custom_settings : {progressTarget : "fsUploadProgress",cancelButtonId : "btnCancel"},             button_image_url: "",             button_width: 75,             button_height: 28,             button_placeholder_id: "buttonPlaceHolder",             button_text_style: "",             button_text_top_padding: 3,             button_text_left_padding: 12,             button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,             button_cursor: SWFUpload.CURSOR.HAND,             file_dialog_start_handler : fileDialogStart,             file_queued_handler : fileQueued,             file_queue_error_handler:fileQueueError,             file_dialog_complete_handler:fileDialogComplete,             upload_progress_handler:uploadProgress,             upload_error_handler:uploadError,             upload_success_handler:uploadSuccess,             upload_complete_handler:uploadComplete             });         })';         return $init;     }
回到正题.我们来看模板swfupload.tpl.php 这个模板使用了一个js来控制<li>以页签的形式显示.我们可以用firebug去找到带有我们要找到的swfupload按钮的那个页签的id 那个id是tab_swf_1 [b]这个是一个div 代码如下. [/b]
[url=<?php echo JS_PATH?>swfupload/swfupload.css]<script language="JavaScript" type="text/javascript" src="<?php echo JS_PATH?>swfupload/swfupload.js"></script> <script language="JavaScript" type="text/javascript" src="<?php echo JS_PATH?>swfupload/fileprogress.js"></script> <script language="JavaScript" type="text/javascript" src="<?php echo JS_PATH?>swfupload/handlers2.js"></script> <script type="text/javascript"> <?php echo initupload($_GET['module'],$_GET['catid'],$args,$this->userid,$this->groupid,$this->isadmin)?> </script>
[b]代码如上所示.[/b] 然后在我们的模板里面想要放置swfupload的地方写上这样的标签
这样我们就已经把swfupload引入到我们需要的地方了.接着就是能够正常执行上传等功能. 但是这样还不能达到我们的需求.而且有一个问题.我们把文件上传到神马地方去了.那我们就来找找我们把文件上传到神马地方去了 在配置文件(用initupload函数输出的)里面有这样一行
[url=javascript:;]    } else {         var img = '<a href="javascript:;" onclick="javascript:att_cancel(this,'+id+',\'upload\')" class="on"><div class="icon"></div><img src="statics/images/ext/'+ext+'.png" width="80" imgid="'+id+'" path="'+src+'" title="'+filename+'"/></a>';     }     $.get('index.php?m=attachment&c=attachments&a=swfupload_json&aid='+id+'&src='+src+'&filename='+filename);     $('#fsUploadProgress').append('<li><div id="attachment_'+id+'" class="img-wrap"></div></li>');     $('#attachment_'+id).html(img);     $('#att-status').append('|'+src);     $('#att-name').append('|'+filename); }
这个方法的目的是在id为fsuuploadprogress的元素里面添加我们上传成功的附件.但是我们还木有找到文件到底去哪里了 关键的地方来了.我们在swfupload方法里面不是有个attachment的系统类的实例么 真正上传附件是在这里实现的.我们调用了attachment里面的upload方法来实现了文件的上传. 这个attachment文件里面的upload方法在系统类里面 也就是phpcms/libs/classes/attachment.class.php里面 在这个类里面我们可以找到upload方法里面有这样一行
这个自然就是指定了上传到的目录.文件名是通过getname方法来获取的. [b]到这里我们就理清思路了.[/b] [b]系统是这么运行的 [/b] 首先在模板里面引用swfupload(配置文件是用函数生成的)->上传文件->attachment模块里的swfupload方法处理(使用系统的attachment类里面的upload方法循环上传附件.并返回结果给swfupload方法)->处理结果通过swfupload的方法(fileDialogComplete)返回给页面. 在上面我们已经实现了在模板里面引入swfupload.但是我们使用的配置文件和上传附件的方法等都是系统原来自带的.并不能实现我想要的目录结构和文件命名方法.怎么办.. 改. 怎么改,首先们要把配置文件改掉. 在自己的模块里面的functions文件夹里面建立自己的函数.我们用自己的函数名称 文件命名为global.func.php这样系统会通过auto_load把我们的函数加载 进去我们把系统中attachment模块functions文件夹下面的global.func.php里面的initupload函数全盘拷贝进来.只修改其中的一行
[u]复制代码[/u] 代码如下:
upload_url:"'.APP_PATH.'index.php?m=你的模块名称&c=你的控制器名称&a=你的方法名称&dosubmit=1",
这样文件就会提交到我们的控制器下面.并且调用我们自己写的方法 然后我们去改系统的attachment类  我们在自己的模块下的classes文件夹下面建立一个myattachment.class.php 写一个我们自己的类.去集成系统的attachment类.(记得吧里面的私有方法copy过来.)我们需要修改几行.首先一点是吧upload方法里面的上传目录改掉.然后是改掉文件名的命名方法.
[u]复制代码[/u] 代码如下:
function upload($field, $alowexts = '', $maxsize = 0, $overwrite = 0,$thumb_setting = array(), $watermark_enable = 1) {         if(!isset($_FILES[$field])) {             $this->error = UPLOAD_ERR_OK;             return false;         }         if(empty($alowexts) || $alowexts == '') {             $site_setting = $this->_get_site_setting($this->siteid);             $alowexts = $site_setting['upload_allowext'];         }         $fn = $_GET['CKEditorFuncNum'] ? $_GET['CKEditorFuncNum'] : '1';         $this->field = $field;         $this->savepath = $this->upload_root.$this->upload_dir.date('Ymd');//这里我们需要修改下.也可以不修改.在我们实例化这个类的时候再来指定目录.         $this->alowexts = $alowexts;         $this->maxsize = $maxsize;         $this->overwrite = $overwrite;         $uploadfiles = array();         $description = isset($GLOBALS[$field.'_description']) ? $GLOBALS[$field.'_description'] : array();         if(is_array($_FILES[$field]['error'])) {             $this->uploads = count($_FILES[$field]['error']);             foreach($_FILES[$field]['error'] as $key => $error) {                 if($error === UPLOAD_ERR_NO_FILE) continue;                 if($error !== UPLOAD_ERR_OK) {                     $this->error = $error;                     return false;                 }                 $uploadfiles[$key] = array('tmp_name' => $_FILES[$field]['tmp_name'][$key], 'name' => $_FILES[$field]['name'][$key], 'type' => $_FILES[$field]['type'][$key], 'size' => $_FILES[$field]['size'][$key], 'error' => $_FILES[$field]['error'][$key], 'description'=>$description[$key],'fn'=>$fn);             }         } else {             $this->uploads = 1;             if(!$description) $description = '';             $uploadfiles[0] = array('tmp_name' => $_FILES[$field]['tmp_name'], 'name' => $_FILES[$field]['name'], 'type' => $_FILES[$field]['type'], 'size' => $_FILES[$field]['size'], 'error' => $_FILES[$field]['error'], 'description'=>$description,'fn'=>$fn);         }         if(!dir_create($this->savepath)) {             $this->error = '8';             return false;         }         if(!is_dir($this->savepath)) {             $this->error = '8';             return false;         }         @chmod($this->savepath, 0777);         if(!is_writeable($this->savepath)) {             $this->error = '9';             return false;         }         if(!$this->is_allow_upload()) {             $this->error = '13';             return false;         }         $aids = array();         foreach($uploadfiles as $k=>$file) {             $fileext = fileext($file['name']);             if($file['error'] != 0) {                 $this->error = $file['error'];                 return false;             }             if(!preg_match("/^(".$this->alowexts.")$/", $fileext)) {                 $this->error = '10';                 return false;             }             if($this->maxsize && $file['size'] > $this->maxsize) {                 $this->error = '11';                 return false;             }             if(!$this->isuploadedfile($file['tmp_name'])) {                 $this->error = '12';                 return false;             }             //$temp_filename = $this->getname($fileext);//名称在这里.我们需要修改下        $temp_filename = $file['tmp_name'].$fileext; //修改成原来的系统文件名称.        $savefile = $this->savepath.$temp_filename; $savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile); $filepath = preg_replace(new_addslashes("|^".$this->upload_root."|"), "", $savefile); if(!$this->overwrite && file_exists($savefile)) continue; $upload_func = $this->upload_func; if(@$upload_func($file['tmp_name'], $savefile)) { $this->uploadeds++; @chmod($savefile, 0644); @unlink($file['tmp_name']); $file['name'] = iconv("utf-8",CHARSET,$file['name']); $uploadedfile = array('filename'=>$file['name'], 'filepath'=>$filepath, 'filesize'=>$file['size'], 'fileext'=>$fileext, 'fn'=>$file['fn']); $thumb_enable = is_array($thumb_setting) && ($thumb_setting[0] > 0 || $thumb_setting[1] > 0 ) ? 1 : 0; $image = new image($thumb_enable,$this->siteid); if($thumb_enable) { $image->thumb($savefile,'',$thumb_setting[0],$thumb_setting[1]); } if($watermark_enable) { $image->watermark($savefile, $savefile); } $aids[] = $this->add($uploadedfile); } } return $aids; }
注:这里我们可以再系统的attachment模块下建立MY_attachment.php  但是这样会影响系统的附件上传功能. [b]在我们自己的控制器里面.我们这个时候就需要加载自己写的类了. [/b]
[u]复制代码[/u] 代码如下:
pc_base::load_app_class('你的模块名','',0);
其余的操作可以参照系统的attachment模块下的attachments控制器里面的swfupload方法来修改. 至此.我便完成了我的目的.在不改变系统文件目录的基础上.完成我自己想要的文件上传功能.
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部