织梦文件上传功能分析教程,DEDE技术
导读:DEDE技术DEDE技术织梦系统里面的上传功能比较多,例如有友情连接里的logo上传、模块管理里面的上传模块和模块打包、发布新图集里面的上传图片集、发布新软件里的上传本地文件、附件管理dede会员中心模板织梦cms模板。
织梦系统里面的上传功能比较多,例如有友情连接里的logo上传、模块管理里面的上传模块和模块打包、发布新图集里面的上传图片集、发布新软件里的上传本地文件、附件管理里面的上传新文件、文件式管理器里面的文件上传、织梦会员中心里面的软件上传和缩略图等等,在织梦里面的文件上传功能到处都有应用。 我们分析三个有代表性的,一个是logo上传,这个是一般的应用,但相对复杂一点;另一个是附件管理时面的上传新文件,这二个一个共同特点是上传的文件都要保存到数据库里面,第三个是文件式管理器里面的文件上传功能,这个与我们之前的教程“php文件(单文件和多文件)上传详解教程”讲的一样,都是简单的上传文件,没有用到数据库知识,我们就以这三个为例子,其它的上传跟这三个可以说大同小异。 要分析这三个文件让传功能,需要对织梦文件上传处理方式,织梦与我们在php文件(单文件和多文件)上传详解教程里看到的文件上传是很不一样的,毕竟,织梦系统是一比较成熟的cms系统,织梦处理文件上传,不像我们看的教程一样写一个文件就可以了,因为,织梦系统里面用到的文件上传很多,不光是织梦系统,其它系统一定会用到文件上传,只要是网站就会用到文件上传功能。 织梦是如何处理文件上传的呢?要了解这个我们就要分析一下文件上传的共同点,然后,把这公共部分放在一个文件,然后,其它上传文件就直接引用这个文件就可以了,这样其它每个上传功能如logo上传,图片集上传,软件上传等各自写适合自己的代码,然后,再引用公共部分即可。这种思想正是函数产生的思想,什么是函数简单而言之,就是把公共功能写成一段代码,其它,需要这个功能时直接调用,而本篇讲的文件调用也正是如此。 织梦文件上传公共部织梦模板分在根目录(http://www.dedebase.com这就是根目录,如果你在本地的话根目录就是http://localhost)/include/uploadsafe.inc.php,对就在uploadsafe.inc.php文件里面,这个引用文件功能是:“转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数。”。 织梦是如何把这个文件配置到要引用它的文件里的呢?首页,要在/include/common.inc.php里面,写一句如下代码: if($_FILES) { require_once(DEDEINC.'/uploadsafe.inc.php'); } 这段代码的意思就是,当要上传文件时,就引用文件uploadsafe.inc.php,如果我们打开例如logo上传文件friendlink.add.php你会发现,没有这个uploadsafe.inc.php文件,是的,织梦还配置了一个在根目录/dede/里面的config.php文件,这个是后台dede网站模板根目录/dede/所有php文件共有的,如果你随便打开个文件,你会发现都引用了这个文件,这个config.php不仅仅包括了上传文件,还包括了数据库连接等很多织梦程序所必备的内容。为什么这样包涵来包涵去?还是为了开发方便,试想如果我们把这些文件里的东西都写进friendlink.add.php里面,那文件得多大啊,更重要的是重复写相同的内容,不利于开发。 我们就拿logo上传为例子这些文件是这样相互包括的:friendlink.add.php 引入config.php,config.php引入common.inc.php,common.inc.php引入uploadsafe.inc.php。这样无论friendlink.add.php如何改变都不影响后面的文件,有利于开发。 现在我们就要分析一uploadsafe.inc.php是如何转换上传的文件变量即$_FILES及安全设置的。 打开uploadsafe.inc.php文件,找到foreach($_FILES as $_key=>$_value)这句,这句前面是设置强制哪些文件类型可以上传,并设置了一个数组$keyarr = array('name', 'type', 'tmp_name', 'size');数组$keyarr值正是$_FILES的键,这是为后面进行数组遍历作准备。还对是不是通过编辑器上传作了判断。 在foreach($_FILES as $_key=>$_value)后面是重点了,通过foreach($_FILES as $_key=>$_value)我们可以得到$_key,这个$_key正是我们表单里面的类型为file的name属性值,这一点非常重要。这句foreach($_FILES as $_key=>$_value)代码就是为了得到这个$_key。为了进一步说明这个$_key我们把$_FILES数组存储的内容分析一下,这里以单个文件上传为例子,多个文件一样。$_FILES存储的内容如下。 Array ( [upmyfile] => Array ( [name] => 1440x900wolf.jpg [type] => image/jpeg [tmp_name] => D:\APMServ5.2.6\tmp\uploadtemp\php6B1.tmp [error] => 0 [size] => 160666 ) ) 这句代码foreach($_FILES as $_key=>$_value),正是为了获得这个$_key就是$_FILES里面的upmyfile。接下来我们就要得到name,type,tmp_name,error,size了,我们完全可以再遍历一下$_value,因为$_value又是一个数组,包括这些内容,但是大家想一下,这只是单文件上传,如果是一个多文件上传,是不是比较重杂?是的,织梦想到了一好办法就是先定义一个$Keyarr数组,直接从这个数组里面获取name,type,tmp_name,error,size,既简单,又方快速。 代码foreach($keyarr as $k)这句正是为了获取name,type,tmp_name,error,size内容。 接下来这句代码$$_key = $_FILES[$_key]['tmp_name'];是这个uploadsafe.inc.php里面的重中之重,这个代码的等价于$upmyfile = D:\APMServ5.2.6\tmp\uploadtemp\php6B1.tmp;以后,我们在引用uploadsafe.inc.php这个文件的文件里看到类似$upmyfile就等于是$_FILES[$_key]['tmp_name']即上传文件临时文件名,同理 ${$_key.'_name'} = $_FILES[$_key]['name'] 等价于 $upmyfile_name = $_FILES[$_key]['name'] = 1440x900wolf.jpg。 ${$_key.'_type'} = $_FILES[$_key]['type'] 等价于 $upmyfile_type = $_FILES[$_key]['type'] = image/jpeg。 ${$_key.'_size'} = $_FILES[$_key]['size'] 等价于 $upmyfile_size = $_FILES[$_key]['size'] = 160666。 之所以通过以上方式处理,就是为了在引用uploadsafe.inc.php文件的文件里面,不出现类似$_FILES[$_key]['size']这样长的代码。 后面的代码就是对文件上传的文件名是不是空,是不是我们允许的文件后缀,文件名是不是少个点进行判断;对文件大小是不是0,如果是我们通过系统函数filesize()获取,如果更加详细的判断还要判断一下,用户上传的内容是不是超出了我们设置的大小,是不是超出了服务器设置的大小,但织梦没有判断在上一个教程“php文件(单文件和多文件)上传详解教程”我们已经作了详细判断。 最后,对上传的文件类型进行判断,强制使用我们设置的文件类型。 总结:uploadsafe.inc.php用到的系统函数有是否存在函数etmpty(),通过正则来判断是否匹配preg_match(),检查数组中是否存在某个值in_array(),将字符串转化为小写strtolower(),去除字符串首尾处的空白字符(或者其他字符)trim(),preg_replace — 执行一个正则表达式的搜索和替换等函数,现在我们对uploadsafe.inc.php这个文件已经分析完了。 一、logo文件上传如下图所示。
声明: 本文由我的SEOUC技术文章主页发布于:2023-07-20 ,文章织梦文件上传功能分析教程,DEDE技术主要讲述文件上传,标签,织梦网站建设源码以及服务器配置搭建相关技术文章。转载请保留链接: https://www.seouc.com/article/web_31649.html