前言
 最近项目中要求使用HTTP做文件上传,而且要求有进度显示,在网上东找西寻了半天,
 解决方案倒也不少,比如使用Ajax上传,但感觉这种方式的进度提示太麻烦,所以没有采用,
后来看到了SWFUpload,就找了些资料来看,觉得符合自己的要求,研究了足有两天,
略有心得,忙不迭地记录下来,以防止时间长了遗忘,
下面摘抄一段SWFUpload官网的介绍(别人翻译过来的):
SWFUpload 最初是由Vinterwebb.se 开发的客户端文件上传工具。它结合javascript和
flash在浏览器中提供一个优于传统上传标签  的功能(和良好的用户体验)。
SWFUpload 的主要特性:
    文件浏览对话框中可以选择多个文件
    AJAX风格的上传,不用重刷新
    上传过程中的各种事件.
    可以在客户端调节图片大小
    它使用的类命名空间兼容各种js库(i.e., jQuery, Prototype, 等.).
    支持 Flash 9 and Flash 10 (2.2.0版本后取消对flash 8的支持)
SWFUpload 的设计理念与其他基于flash的上传工具不同。SWFUpload 给开发者尽可能多的UI控制能力.
 开发者可以使用 XHTML, CSS, JavaScript 来使它更符合自己网站的样式风格. 
它提供一组简单的js事件更新上传状态,开发者可以根据这些事件来在网页中显示文件上传进度
好了,夸奖的话不多说了,既然它这么受欢迎,想必是有一定优势的。
下面记录一下我做的一个小示例,先预览一下程序运行效果:
SWFUpload文件上传效果图
有朋友索要例子源码,其实我早已放在我的资源里了,并没有设置下载积分,
有需要的朋友请到这里下载:http://download.csdn.net/detail/zhangyihui1986/4538748
准备工作
现在SWFUpload项目托管于Google code下,URL为:http://code.google.com/p/swfupload/  ,
请自行下载,下载的压缩文件中含有一个文档,里面详细介绍了SWFUpload的配置参数、事件支持、支持方法等。
这里是官网上的几个例子:http://demo.swfupload.org/
网络上关于SWFUpload的博客资源很多,但很多博客质量不太高,而且转来转去,内容重复,
所以我在查资料的时候没有找到太合适的资源,后来找到了这里:
http://webdeveloperplus.com/jquery/multiple-file-upload-with-progress-bar-using-jquery/ 
,这是一个外国人写的关于SWFUpload的小教程,UI做地也挺好,
于是我就参照着做了个小例子。
不过,上面链接的教程是针对SWFUpload一个针对JQuery的插件写的,这个插件地址为:
 使用它可采用JQuery的链式写法,但我没有用它,而是用的原生的SWFUpload2.2版本。
示例实现步骤
不多说,先贴出来我做的例子,然后再针对代码作适当解释。
例子使用了Struts2.3.4作为后台,当然,SWFUpload是不选择后台的,您可以使用任意的技术,
只要是能实现HTTP协议即可。
1)将下载的压缩文件解压并拷到web项目中(此处我放到项目的js目录下),
建立其它资源(如JSP、Action等)后目录结构如下图所示:
项目结构
2)在JSP文件中引入SWFUpload依赖的JS文件
[html]view plaincopy
    /js/ligerUI/skins/Aqua/css/ligerui-all.css"type="text/css"rel="stylesheet"/>
    
    
    
    
    
    
在此处我用到了ligerUI框架,如果不使用它,那么仅需要引jquery和swfupload.js两个文件即可。
3)JSP文件中HTML结构
[html]view plaincopy
    
    
    

         
4)JSP文件中CSS,给文件上传进度列表赋与样式,我对CSS不够熟悉, 此处的样式几乎全部来自于前面那个教程,仅作了一些小的变动。如果您觉得这还不够好,那您自己来实现漂亮的UI界面吧! [css]view plaincopy     #logList { margin: 0; padding: 0; width: 500px }        #logList li { list-style-position: inside; margin: 2px; border: 1pxsolid#ccc;      padding: 10px; color: #333;      font-size: 15px; background: #FFF; position: relative; }        #logList li .progressBar { border:1pxsolid#333; height:5px; background:#fff; }          #logList li .progressValue { color: red; margin-left: 5px }          #logList li .progress { background:#999; width:0%; height:5px; }          #logList li p { margin:0; line-height:18px; }          #logList li.success { border:1pxsolid#339933; background:#ccf9b9; }        #logList li span.cancel { url('.. /p_w_picpaths/delete.gif') no-repeat; position:absolute; top:5px;                  right:5px; width:16px; height:16px; cursor:pointer }    5)JSP中的Javascript,主要是创建SWFUpload组件实例,并绑定监听函数,在监听函数中处理进度提示: [javascript]view plaincopy     var contextPath;      var queueErrorArray;      $(function(){          contextPath = $("#contextPath").val();      var swfUpload = new SWFUpload({              upload_url: contextPath + '/swfupload/upload!upload.action',              flash_url: contextPath + '/js/swfupload/Flash/swfupload.swf',              file_post_name: 'fileData',              use_query_string: true,              post_params: {                  param1: 'Hello',                  param2: encodeURI('你好',"utf-8")              },              file_types: "*.rar;*.zip",              file_types_description: '上报数据文件',              file_size_limit: '102400',      //      file_upload_limit: 5,             file_queue_limit: 3,      // handlers             file_dialog_start_handler: fileDialogStart,              file_queued_handler: fileQueued,              file_queue_error_handler: fileQueueError,              file_dialog_complete_handler: fileDialogComplete,              upload_start_handler: uploadStart,              upload_progress_handler: uploadProgress,              upload_success_handler: uploadSuccess,              upload_complete_handler: uploadComplete,              button_placeholder_id: 'spanButtonPlaceholder',              button_text: '选择文件',              button_text_style: '.whiteFont{ color: #FFFFFF; }',              button_text_left_padding: 40,              button_text_top_padding: 6,              button_p_w_picpath_url: contextPath + '/p_w_picpaths/button.png',              button_width: 133,              button_height: 33,              button_cursor: SWFUpload.CURSOR.HAND,              button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,              debug: false,              custom_settings: {}          });      });      //===========  回调函数Handlers  ===================================     /**     * 打开文件选择对话框时响应     */     function fileDialogStart() {      if (queueErrorArray) {              queueErrorArray = null;          }      }      /**     * 文件被加入上传队列时的回调函数,增加文件信息到列表并自动开始上传.     * 

    * SWFUpload.startUpload(file_id)方法导致指定文件开始上传,     * 如果参数为空,则默认上传队列第一个文件;     * SWFUpload.cancelUpload(file_id,trigger_error_event)取消指定文件上传并从队列删除,     * 如果file_id为空,则删除队列第一个文件,trigger_error_event表示是否触发uploadError事件.     * @param file 加入队列的文件     */     function fileQueued(file) {      var swfUpload = this;      var listItem = '';          listItem += '文件:' + file.name + '(' + Math.round(file.size/1024) + ' KB)';          listItem += ''                   + '