最近在做的一个工具需要有批量图片上传功能,所以就分析了一下家园中flash批量上传功能,以便给自己的模块添加这个功能。
批量上传flash的页面的url是
- home.php?mod=spacecp&ac=upload&op=flash&albumid=0
复制代码 通过URL分析到,我们要找的代码在 home_spacecp.php 中,我们看到在这个文件最后一行,把ac这个参数作为名称包含了一个include文件,ac参数的值是 upload ,所以我们要找的文件是 spacecp_upload.php
- require_once libfile('spacecp/'.$ac, 'include');
复制代码 再继续看这个文件,这里面虽然也有近三百行,不过我们只关注flash批量上传,所以就在这里面摘出所需要的东西就好了。其中包含了模板文件 spacecp_upload.htm 224行开始的代码就是op = flash进入的流程
- </div>
- <div class="bm">
- <script type="text/javascript">
- document.write(AC_FL_RunContent(
- 'width', '100%', 'height', '400',
- 'src', '{IMGDIR}/album_upload.swf?config=$config&albumid=$_GET[albumid]',
- 'quality', 'high', 'wmode', 'transparent'
- ));
- </script>
复制代码 这里面调用了flash文件,并且给flash文件传入了2个参数,参数的url是config=$config&albumid=$_GET[albumid]',
config 和 albumid
albumid就是我们进入批量上传flash时候url中带的albumid
config是一个php变量,这个我们在 home_spacecp.php 文件中找。
- $config = urlencode($_G['siteroot'].'home.php?mod=misc&ac=swfupload&op=config'.($_GET['op'] == 'cam'? '&cam=1' : ''));
复制代码 $config 传入的是一个路径,我们看看这个路径是什么。在浏览器中打开这个路径。后面跟的config'.($_GET['op'] == 'cam'? '&cam=1' : ''));参数我们暂时先忽略。
打开后出现的是一个xml文件
看xml文件的内容大概知道了,这个应该是flash上传框的配置文件,包括了它的菜单按钮的文字等。
我们看这段的php文件。文件是 home_misc.php 其中没有什么有用的内容,依旧包含了一个include文件 misc_swfupload.php
我们看这个文件。
这个文件就是flash批量上传的核心控制文件了。其中可以分为4块内容
第1块 1-34行,基本参数配置,
第2块36-53行,上传完成后的后续处理代码
第3块53-76行,生成传入flash的配置参数
第4块77-96行,上传图片代码
其他
原理是这样,flash作为一个客户端执行post ,post的地址就是我们config中的uploadurl,看下也就是现在这个文件自己。
所以我们说上传的控制也就是这个php文件了。第一部分有
- if(!empty($_POST['uid'])) {
复制代码 这样开始的一段代码,就是处理post来的uid,因为flash post过来之后。就没有$_G等信息存在了。所以要在这里判断一下用户权限,并且设置一下。然在第四块,对$_FILES 进行处理,在这里用的是一个pic_save函数,我们查一下可以查到。函数里调用了discuz 的upload类进行文件上传。之后返回一个数组$uploadfiles。根据返回数组的值,我们判断上传是否成功。并且设置状态$status
根据状态位,我们输出flash的配置参数,其中还涉及到了一个文件,刚才没有提到,misc_swfupload.htm 这个文件是一个xml的模板文件,根据我们 misc_swfupload.php 中的配置信息,输出相应的xml
好了flash批量上传大体就是这个样子,其中涉及到一些细节的参数没有提到,感兴趣的可以自己去试一试,哪个参数是做什么的。让这个flash批量上传功能完全为我们自己所用。
|