SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。
当前版本v2.2.0.1
官网示例:demo.swfupload.org
官方文档:http://demo.swfupload.org/Documentation/
下载地址:
https://code.google.com/p/swfupload/downloads/list
主要特点
Ø 可以同时选择多个文件
Ø 类似AJAX的无刷新上传
Ø 可以显示上传进度
Ø 良好的浏览器兼容性
Ø 兼容其他JavaScript库 (例如:jQuery, Prototype等)
Ø 支持Flash 8和Flash 9及更高版本
原理简介:
开始配置
准备工作:
从官网下载的压缩包中,拿到以下文件(附件中有整理好的文件)
SWFUpload v2.2.0.1 Core\swfupload.js
SWFUpload v2.2.0.1 Core\Flash\swfupload.swf
SWFUpload v2.2.0.1 Samples\demos\simpledemo\js\fileprogress.js
SWFUpload v2.2.0.1 Samples\demos\simpledemo\js\handlers.js
SWFUpload v2.2.0.1 Samples\demos\simpledemo\js\swfupload.queue.js
放在指定文件夹中
deploy\media\js\swfupload
deploy\jbossweb-tomcat41.sar\META-INF\mime.types
swfupload.swf、swfupload.js是核心文件
handlers.js是事件处理
fileprogress.js是文件队列处理
mimetype.properties是mime类型码表
从页面初始化到用户选择文件最后上传结束是这样的一个过程:
a页面载入(初始化选择控件)—b用户选择多文件—c形成文件队列—d触发上传(队列中的文件依次上传)—e后台处理—f向前台返回结果
其中d-e-f将根据文件数量重复执行,从a-f过程中所有的动作都由事件来驱动,可以自定义捕获每个事件,所以对于程序员来说非常适合订制自己的上传界面。
SWFUpload官方对PHP支持比较好,JSP需要修改和移植,而为了适配公司的Struts 1.x更需要解决如下问题:
1. 对表单验证失败的不进行上传,避免服务器资源浪费。
解决办法:用户批量选择完文件后,先存入队列,点击页面的提交按钮,先验证表单各项都正确无误,然后上传文件,最后进行提交。
2. SWFUpload上传的文件使用file.getContentType()取得的MIME类型总是多媒体。
解决办法:使用MimetypesFileTypeMap用后缀名从资源文件中获取MIME类型。
gds.jap.affix.business. ManageAffixService.createAttachmentUseSWF(String aWorkID, String aSource)
3. SWFUpload使用的编码格式是UTF-8,中文名称在GBK下会成乱码。
解决办法:把上传的文件名作为参数,后台用URLDecoder转码获取正确的文件名。
JSP页面
Ø 引入JS文件
Ø 定义初始化参数
Ø 声明、创建SWF对象
Ø 修改提交方式
Struts Form
Ø 声明接收FormFile的对象
Ø 声明获得附件最大限制的getter方法
Struts Action
Ø 从参数来获得上传的标识,进行上传的动作
Ø 从参数中获得上传文件名,进行转码
Ø 调用manageAffixService.createAttachmentUseSWF方法,解决MIME类型的问题
附件上传
gds.jap.affix.business. ManageAffixService.createAttachmentUseSWF(FormFile file, String fileName, String attachmentDesc, String clientIP)