设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-07-09 12:04 所属栏目:121 来源:互联网
导读:正式接触phpcms模块开发后.开发了几个功能模块.其中遇到了需要批量上传图片的问题.于是开始挖掘phpcms里面的swfupload的用法. 在phpcms里面自带的内容类型里面能够直接指定图片组.不过这样的图片组功能并不是我想用的.我需要上传一整个静态的html文件.需要
  正式接触phpcms模块开发后.开发了几个功能模块.其中遇到了需要批量上传图片的问题.于是开始挖掘phpcms里面的swfupload的用法.
 
  在phpcms里面自带的内容类型里面能够直接指定图片组.不过这样的图片组功能并不是我想用的.我需要上传一整个静态的html文件.需要
 
  能够找到一个方法上传整个文件夹.并且能够保留原来的文件名称.
 
  目的总结如下:
 
  1,不改变系统的文件和目录结构.
 
  2,实现多附件上传功能.
 
  3,能够得到上传后的文件夹名称.
 
  在phpcms中自带了附件上传的功能.我想去用swfupload功能,而这个功能被phpcms的附件上传功能集成进去了.那我要做的就是抽出来并加以修改.
 
  第一步,我来研究研究这个是怎么调用的.
 
  首先,打开firefox浏览器的firebug 打开网络面板.找到phpcm中swfupload呗调出的那个按钮.看看系统是请求的什么连接.
 
  前面的我们就先不管了 ,那是处理上传的东西.我从else开始看.首先验证了是否允许附件上传
  然后从$_GET里面得到swfupload的参数args,然后去验证了密匙,密匙通过了去解析args.得到网站的id,得到网站的设置,得到允许上传附件的大小.从cookie里面得到未使用的附件列表.
 
  设置模板里面的各种显示.最后也是最关键的.它使用了swfupload模板.也就是说我要找到这个模板.看看swfupload是怎么引过来的.
 
  模板在这里:phpcms/modules/attachment/templates/swfupload.tpl.php
 
  打开模板文件.模板文件上面引入了一堆文件:
 
  复制代码 代码如下:www.CuoXIn.com
 
  <?php $show_header = $show_validator = $show_scroll = 1; include $this->admin_tpl('header', 'attachment');?>
  <link href="<?php echo JS_PATH?>swfupload/swfupload.css" rel="stylesheet" type="text/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这个插件.
 
  复制代码 代码如下:www.CuoXIn.com
 
  /* 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
 
  在这里我们看到有一个span id是buttonPlaceHolder 而在配置文件中有这么一行button_placeholder_id: "buttonPlaceHolder",很明显.当页面被加载的时候 id为buttonPlaceHolder的元素会被JS替换成swfupload的上传控件.
  之后一步我们要在点选完文件之后触发swf的上传方法
 
  会在代码中找到如下代码.这里面调用了swfu.startUpload()方法.这个方法定义的地方在swfupload.js里面.我们无需理会.
 
  复制代码 代码如下:www.CuoXIn.com
 
  <input type="button" id="btupload" value="<?php echo L('start_upload')?>" onClick="swfu.startUpload();" />
 
  至此.我们已经找到了swfupload的上传控件使用方法
  怎么在我的程序里面调用这个东东呢
 
  首先一点 我们需要在这个控件出现的模板里面引入这些必要的文件
 
  复制代码 代码如下:www.CuoXIn.com
 
  <link href="<?php echo JS_PATH?>swfupload/swfupload.css" rel="stylesheet" type="text/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>
 
  代码如上所示.
  然后在我们的模板里面想要放置swfupload的地方写上这样的标签
 
  复制代码 代码如下:www.CuoXIn.com
 
  <span id="buttonPlaceHolder"></span>
  <input type="button" id="btupload" value="<?php echo L('start_upload')?>" onClick="swfu.startUpload();
 
  这样我们就已经把swfupload引入到我们需要的地方了.接着就是能够正常执行上传等功能.
  但是这样还不能达到我们的需求.而且有一个问题.我们把文件上传到神马地方去了.那我们就来找找我们把文件上传到神马地方去了
 
  在配置文件(用initupload函数输出的)里面有这样一行
 
  复制代码 代码如下:www.CuoXIn.com
 
  upload_url:"'.APP_PATH.'index.php?m=attachment&c=attachments&a=swfupload&dosubmit=1",
 
  这个很明显就透露出了我们把文件上传到了attachment模块中attachments控制器里面的swfupload方法去处理了
  这个地方也就是我之前没有关注的if里面的东西.
 
  拿出来看看
 
  复制代码 代码如下:www.CuoXIn.com
 
  if( $_POST['swf_auth_key'] != md5(pc_base::load_config('system','auth_key').$_POST['SWFUPLOADSESSID']) || ($_POST['isadmin']==0 && !$grouplist[$_POST['groupid']]['allowattachment'])) exit();
  pc_base::load_sys_class('attachment','',0);
  $attachment = new attachment($_POST['module'],$_POST['catid'],$_POST['siteid']);
  $attachment->set_userid($_POST['userid']);
  $aids = $attachment->upload('Filedata',$_POST['filetype_post'],'','',array($_POST['thumb_width'],$_POST['thumb_height']),$_POST['watermark_enable']);
  if($aids[0]) {
  $filename= (strtolower(CHARSET) != 'utf-8') ? iconv('gbk', 'utf-8', $attachment->uploadedfiles[0]['filename']) : $attachment->uploadedfiles[0]['filename'];
  if($attachment->uploadedfiles[0]['isimage']) {
  echo $aids[0].','.$this->upload_url.$attachment->uploadedfiles[0]['filepath'].','.$attachment->uploadedfiles[0]['isimage'].','.$filename;
  } else {
  $fileext = $attachment->uploadedfiles[0]['fileext'];
  if($fileext == 'zip' || $fileext == 'rar') $fileext = 'rar';
  elseif($fileext == 'doc' || $fileext == 'docx') $fileext = 'doc';
  elseif($fileext == 'xls' || $fileext == 'xlsx') $fileext = 'xls';
  elseif($fileext == 'ppt' || $fileext == 'pptx') $fileext = 'ppt';
  elseif ($fileext == 'flv' || $fileext == 'swf' || $fileext == 'rm' || $fileext == 'rmvb') $fileext = 'flv';
  else $fileext = 'do';
  echo $aids[0].','.$this->upload_url.$attachment->uploadedfiles[0]['filepath'].','.$fileext.','.$filename;
  }
  注:这里我们可以再系统的attachment模块下建立MY_attachment.php 但是这样会影响系统的附件上传功能.
  在我们自己的控制器里面.我们这个时候就需要加载自己写的类了.
 
  复制代码 代码如下:www.CuoXIn.com
 
  pc_base::load_app_class('你的模块名','',0);
 
  其余的操作可以参照系统的attachment模块下的attachments控制器里面的swfupload方法来修改.
  至此.我便完成了我的目的.在不改变系统文件目录的基础上.完成我自己想要的文件上传功能.

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读