- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章phpcms模块开发之swfupload的使用介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
正式接触phpcms模块开发后.开发了几个功能模块.其中遇到了需要批量上传图片的问题.于是开始挖掘phpcms里面的swfupload的用法. 。
在phpcms里面自带的内容类型里面能够直接指定图片组.不过这样的图片组功能并不是我想用的.我需要上传一整个静态的html文件.需要 。
能够找到一个方法上传整个文件夹.并且能够保留原来的文件名称. 。
目的总结如下
1,不改变系统的文件和目录结构. 。
2,实现多附件上传功能. 。
3,能够得到上传后的文件夹名称. 。
在phpcms中自带了附件上传的功能.我想去用swfupload功能,而这个功能被phpcms的附件上传功能集成进去了.那我要做的就是抽出来并加以修改. 。
第一步,我来研究研究这个是怎么调用的. 。
首先,打开firefox浏览器的firebug 打开网络面板.找到phpcm中swfupload呗调出的那个按钮.看看系统是请求的什么连接. 。
我们捕捉到一串这样的请求.调用了attachment模块的attachements控制器里面的swfupload方法. 。
。
我们去找到这个模块中的这个控制器里面的这个方法. 。
在phpcms/modoules/attachemet/attachemts.php里面 。
打开看看,代码如下 。
前面的我们就先不管了 ,那是处理上传的东西.我从else开始看.首先验证了是否允许附件上传 。
。
然后从$_GET里面得到swfupload的参数args,然后去验证了密匙,密匙通过了去解析args.得到网站的id,得到网站的设置,得到允许上传附件的大小.从cookie里面得到未使用的附件列表. 。
设置模板里面的各种显示.最后也是最关键的.它使用了swfupload模板.也就是说我要找到这个模板.看看swfupload是怎么引过来的. 。
模板在这里:phpcms/modules/attachment/templates/swfupload.tpl.php 。
打开模板文件.模板文件上面引入了一堆文件
首先是引入了头文件.我大概看里一下.里面有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 。
这个是一个div 代码如下. 。
<div id="div_swf_1" class="content pad-10 <?php echo $div_status?>"> <div> <div class="addnew" id="addnew"> <span id="buttonPlaceHolder"></span> </div> <input type="button" id="btupload" value="<?php echo L('start_upload')?>" onClick="swfu.startUpload();" /> <div id="nameTip" class="onShow"><?php echo L('upload_up_to')?><font color="red"> <?php echo $file_upload_limit?></font> <?php echo L('attachments')?>,<?php echo L('largest')?> <font color="red"><?php echo $file_size_limit?></font></div> <div class="bk3"></div> 。
。
<div class="lh24"><?php echo L('supported')?> <font style="font-family: Arial, Helvetica, sans-serif"><?php echo str_replace(array('*.',';'),array('','、'),$file_types)?></font> <?php echo L('formats')?></div><input type="checkbox" id="watermark_enable" value="1" <?php if(isset($watermark_enable) &&$watermark_enable == 1) echo 'checked'?> onclick="change_params()"> <?php echo L('watermark_enable')?> </div> <div class="bk10"></div> <fieldset class="blue pad-10" id="swfupload"> <legend><?php echo L('lists')?></legend> <ul class="attachment-list" id="fsUploadProgress"> </ul> </fieldset> </div> 。
在这里我们看到有一个span id是buttonPlaceHolder 而在配置文件中有这么一行button_placeholder_id: "buttonPlaceHolder",很明显.当页面被加载的时候 id为buttonPlaceHolder的元素会被JS替换成swfupload的上传控件. 。
。
之后一步我们要在点选完文件之后触发swf的上传方法 。
会在代码中找到如下代码.这里面调用了swfu.startUpload()方法.这个方法定义的地方在swfupload.js里面.我们无需理会. 。
至此.我们已经找到了swfupload的上传控件使用方法 。
。
怎么在我的程序里面调用这个东东呢 。
首先一点 我们需要在这个控件出现的模板里面引入这些必要的文件 。
代码如上所示. 。
。
然后在我们的模板里面想要放置swfupload的地方写上这样的标签 。
这样我们就已经把swfupload引入到我们需要的地方了.接着就是能够正常执行上传等功能. 。
。
但是这样还不能达到我们的需求.而且有一个问题.我们把文件上传到神马地方去了.那我们就来找找我们把文件上传到神马地方去了 。
在配置文件(用initupload函数输出的)里面有这样一行 。
这个很明显就透露出了我们把文件上传到了attachment模块中attachments控制器里面的swfupload方法去处理了 。
。
这个地方也就是我之前没有关注的if里面的东西. 。
拿出来看看 。
这个里面有几行是比较重要的. 。
。
首先它载入了系统的attachment类.并且用到了里面的方法. 。
程序对上传成功做了echo操作.返回的东西是 返回了编号,上传后的地址,拓展名,文件名. 。
这些东西是给谁用的啊 我们还得回去看配置文件. 。
配置文件里面有一段是上传过程中各个事件将触发的方法. 有开始上传的.有上传成功的,有上传失败的.等等. 。
我们可以看见有一个方法是file_dialog_complete_handler:fileDialogComplete.
其实这些已经升级到swfupload的范畴了.有兴趣可以去研究研究 。
然后我们在phpcms/static/swfupload/handler.js里面找到这个方法. 。
看见上传成功后echo出来的数据被解析了. 。
解析的方法如下 。
这个自然就是指定了上传到的目录.文件名是通过getname方法来获取的. 。
。
到这里我们就理清思路了. 。
系统是这么运行的 。
首先在模板里面引用swfupload(配置文件是用函数生成的)->上传文件->attachment模块里的swfupload方法处理(使用系统的attachment类里面的upload方法循环上传附件.并返回结果给swfupload方法)->处理结果通过swfupload的方法(fileDialogComplete)返回给页面. 。
在上面我们已经实现了在模板里面引入swfupload.但是我们使用的配置文件和上传附件的方法等都是系统原来自带的.并不能实现我想要的目录结构和文件命名方法.怎么办.. 。
改. 。
怎么改,首先们要把配置文件改掉. 在自己的模块里面的functions文件夹里面建立自己的函数.我们用自己的函数名称 文件命名为global.func.php这样系统会通过auto_load把我们的函数加载 。
进去我们把系统中attachment模块functions文件夹下面的global.func.php里面的initupload函数全盘拷贝进来.只修改其中的一行 。
这样文件就会提交到我们的控制器下面.并且调用我们自己写的方法 。
。
然后我们去改系统的attachment类 我们在自己的模块下的classes文件夹下面建立一个myattachment.class.php 。
写一个我们自己的类.去集成系统的attachment类.(记得吧里面的私有方法copy过来.)我们需要修改几行.首先一点是吧upload方法里面的上传目录改掉.然后是改掉文件名的命名方法. 。
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 但是这样会影响系统的附件上传功能. 。
。
在我们自己的控制器里面.我们这个时候就需要加载自己写的类了. 。
其余的操作可以参照系统的attachment模块下的attachments控制器里面的swfupload方法来修改. 。
。
至此.我便完成了我的目的.在不改变系统文件目录的基础上.完成我自己想要的文件上传功能. 。
最后此篇关于phpcms模块开发之swfupload的使用介绍的文章就讲到这里了,如果你想了解更多关于phpcms模块开发之swfupload的使用介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
晚上在 QQ 上看到昵称为“乱码”的好友回答了搜搜问问里一个问题: 在VBS中有办法定义字节数组么? 在VBS中有办法定义字节数组么?就是字节子类型数组(VarType是8209的那种)注意不是V
例如,员工管理应用程序可能包括一个EmPloyee 类。然后可以用这个类来创建和维护特定实例,比如Gonn和Sally。 根据预定义的类创建对象常称为类的实例化(class insta
在自然语言中,我们理解抽象的概念是,一个物体的一种大的描述,这种描述对某类物体来说是共有的特性。那么在PHP中也是一样的,我们把一个类进行抽象,可以指明类的一般行为,这个类应该是一个模板,它指示它的
DBA_2PC_PENDING Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短的时间内完成,根本无法察觉到。但是,如果在commit或
目录 计算过程 投影分量计算 假设你有一家理发店,已经记录了过去一年中所有顾客的头发长度和发型偏好的数据。现在你想从这些数据中提取一些主要的信息,比如顾客最常
Object.defineProperty函数会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回此对象。 一、简单使用 const obj = {} Object.defineP
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
一 点睛 Thrift 是一歀基于 CS 架构的 RPC 框架,最初由 Facebook 研发,2008 年转入 Apache 组织。开发人员可以使用 Thrift 提供的 IDL(接口定义语言)来定
数据库应用程序与主应用程序分开存在,并存储数据集合。 每个数据库都使用一个或多个API来创建,访问,管理,搜索和复制其包含的数据。 数据库还使用非关系数据源,例如对象或文件。 然而,数据库证明是大数
介绍 Ant是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构件工具。在我们详细了解 Apache Ant 之前, 让我们来讲解为什么构建工具是需要最先了解的。 构建工具的需求
我现在正在尝试学习ocaml,并希望从一个小程序开始,生成所有位组合: [“0”,“0”,“0”] [“0”,“0”,“1”] [“0”,“1”,“0”] ... 等等 我的想法是下面的代码: let
我正在做我的介绍 C 类(class)作业,我的任务是执行以下任务...... 为一个函数编写代码,该函数通过值接收两个参数(a 和 b)并通过引用具有另外两个参数(c 和 d)。所有参数都是双倍的。
我希望提供有关我网站内容的快速演示,以及如何在用户访问我的页面后立即以正确的方式使用它们。我希望使用顶部的弹出式窗口进行演示。 我的意思是小信息框,一个接一个地通知用户各个步骤。任何人都可以帮助我如何
与C、Java等语言一样,JavaScript中可以用&&、||、!三个逻辑判断符来对boolean值进行逻辑判断。与C、Java不同的是,JavaScript中逻辑与(&&
JavaScript中,==与===操作符均可用于判断两个值是否相等;不同之处在于,如果进行判断的两个值类型不一致,===操作符会直接返回false,而==操作符则会在类型转换后再进行判断。详细的判
JavaScript中,object转换为boolean的操作非常简单:所有的object转换成boolean后均为true;即使是new Boolean(false)这样的object在转换为bo
在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测。尤其是当前Activity需要往前一个Activity传送消息时。即Activity1跳转到Activity3如果采用的是
背景 当要求系统启动一个应用程序时,系统会先查找当前命令是否是内部命令,若不是,则在当前目录下查找,如果仍没有找到,则在系统变量 Path 指定的路径去查找。JDK(Java Developmen
概述 想做一个微信的公众平台,阅读了微信官方给的网址接入的示例代码,发现有个问题好像一直都是半知半解的,就是在类里边直接使用$_GET。仔细查了下关于这方面的知识,发现PHP中这部分的基础知识掌握
我是一名优秀的程序员,十分优秀!