本篇旨在比较论坛和日志里上传图片的功能的异同,和解释为何前者在iPad上工作而后者不工作的原因。 论坛的帖子编辑器和日志编辑器都有上传图片的功能,两者的界面非常接近又不完全相同。先看一下他们在我的计算机上的Firefox里的样子: 再看一下他们在iPad里的差异: 可以看出两点: 1)在iPad上没法在日志里添加图片因为没有选择文件上传的按钮,而在论坛里就有选择文件和上传功能,虽然是分成两步走 2)论坛里的添加图片界面在计算机上和IPAD上有所不同,一个是用Flash按钮,一个是用html按钮 所以论坛里的添加图片功能能按客户端的条件选择合适的界面,而日志里的添加图片功能就总是提供Flash按钮,因此无法在iPad上。这是有一个Discuz各部分不一致的地方,日志的功能没论坛强。 让我们来检查一下论坛功能。当网站收到用户的发贴请求如forum.php?mod=postaction=newthreadfid=66时,网站程序内部分派工作的次序 1 forum.php 2 分派给 source\module\forum\forum_post.php 3 分派给 source\include\post\post_newthread.php 4 数据取自 source\class\table\table_forum_post.php 5 格式定义在 template\default\forum\post.htm 6 加入了 template\default\forum\editor_menu_forum.php (包括上传图片的界面) 也是基于MVC,和我们以前讨论过的处理日志目录的请求的流程完全一致。 在格式文件template\default\forum\post.htm里的客户端程序里调用了JavaScript文件static\js\upload.js (通过 template/default/common/upload.htm)并用了其中的SWFUpload类。这个类造出来的对象产生了界面上的Flash object标签,并替代了原来的html内容。 这里用到的SWFUpload是一个第三方的工具: http://code.google.com/p/swfupload/ : SWFUpload is a JavaScript Library that wraps the Flash Player's upload function. It brings your uploads to the next level with Multiple File Selection, Upload Progress and Client-side File Size Checking . Unlike other Flash upload tools, SWFUpload leaves the UI in the developer's hands. Using a set of event handlers developers can display upload progress and status to the user in their own HTML/CSS UI. SWFUpload has been featured in such projects as YouTube and WordPress. http://code.google.com/p/swfupload/source/browse/swfupload/trunk/core/swfupload.js 我们来进一步检查论坛的添加图片功能,计算机上和IPAD上不光界面有所不同,连标题都不同,一个是"上传图片",一个是"普通上传",事实上它们是分开的两部分,只不过一显一隐罢了。如果我们在程序里做个修改就能同时看到它们。 让我们来看看这一显一隐是如何实现的。每个tab都是一个li,定义在editor_menu_form.php里: 从程序里可见,显示"上传图片"还是"普通上传"是由客户端是否支持Flash决定的。 那为何日志里的添加图片功能不能用于iPad呢?类似于template\default\forum\editor_menu_forum.php,日志用的是template\default\home\editor_image_menu.php。这里面的tab只有三个(没有“普通上传”),而且虽然它也用upload.js,但其中在函数disableMultiUpload里隐去“上传图片”的语句有个obj.uploadSource == 'forum'的条件,所以不工作。这就是“上传图片”tab还在但不见按钮的原因。 最后指出一点,在iPad上看到的论坛发贴里的"选择文件"和"未选择文件"的字样不是Discuz带来的简体中文,而是iPad中文版上传文件按钮的带来的。 所以在英文的机器上就会显示为: