`

WEB中多文件上传+进度条的实现(基于swfupload)

阅读更多

功能完全支持ie和firefox浏览器!同样也支持safari浏览器!

一般的WEB方式文件上传只能一个一个的进行上传,在某些应用上就显得很不人性化,客户们都希望能够1次选择很多文件,然后让系统把选择的文件全部上传。

这里,就将针对这个问题提出一个比较完美的解决方案,利用的技术主要有2个:Flash 和 smartupload。Flash 能够让客户一次选择多个文件,而smartupload负责将选择的文件上传到服务器上。

有些朋友看到这里,就知道了,其实就是swfupload方法,具体信息可以访问swfupload官方网站:http://www.swfupload.org/

让我们先来看看客户端的界面效果图。(多选文件,批量上传,上传进度显示)



要做到图中的效果,其实很方便,看完下面的描述,相信大家都可以实现上图中的效果了。
说明:swfupload2中通过一个png图片与flash插件进行关联,可以修改images下的png图片来(如上图中的[选择文件]图片)自定义显示自己想要的图片样子(不要修改图片名字和格式)。

如果你用的不是java环境,不要紧,只要稍作修改,同样可以使用在其他的环境中。

实现步骤:
第1步,要进行下面的过程,必须先准备好Flash插件和smartupload。
Flash插件:相信大家的浏览器早已经安装过了,请检查版本,尽量使用最新的的flash插件。

smartupload。

第2步,前台部分准备客户操作的WEB界面 ,如下[UploadFileExample.jsp、UploadFileExampleSubmit.jsp]


(关于参数 upload_url: "<%=uploadUrl.toString()%>",
要注意提交文件路径,最好用http://.../UploadFileExample.jsp格式的完整路径,即像我例子中写的那样)


注意在(UploadFileExampleSubmit.jsp)中:上传成功后必须返回“successed”,失败的话则返回失败的原因。

第3步 准备后台的文件上传功能。 也就是上面文件[UploadFileExampleSubmit.jsp]中用到的[PhotoMgr.fileUpload(su,pageContext)]方法。

这三部做完就可以了。具体实现可以参见附件中的例子。

 ============================================================

 

遇到的一些问题作汇总后需要注意的一些地方列了出来:

<1> 功能实现需要flash插件支持。
flash版本为 flash 9.0.124 或者 flash 10.0.12.36 版本(这是最新的flash10插件). 如果不是的话,可以去flash官网 http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash 进行在线安装。


<2> UploadFileExample.jsp 中的 upload_url参数设置。
参数需要使用 http://....../UploadFileExampleSubmit.jsp 这样的完整路径.

<3> 关于获取参数 post_params中的参数值。
post_params: {"user_id" : "stephen830","pass_id" : "123456"} 中的参数,不能使用普通的request.getParameter("")方法来获取,
而必须用你的上传方法对应的特定方法来获取,比如,我这里用smartupload,则获取方法就是String userId = su.getRequest().getParameter("user_id");

<4> 上传后不管成功还是失败,都需要有返回值。
这个返回值将传递到对应js中。返回值在UploadFileExampleSubmit.jsp中设置,成功则 out.print("successed"); 失败则 out.print(pageErrorInfo);//pageErrorInfo为错误信息。

该返回值将传递给js目录下的handlers.js文件,具体的方法是 function uploadSuccess(file, serverData) {...} 。

有些朋友的上传成功后out.print("successed"); 发现js收到的"successed"前面会有隐藏字符,遇到这种情况可以更改function uploadSuccess(file, serverData) {...} 中的
var isSuccess = (serverData.indexOf("successed")==0?true:false);
改为
var isSuccess = (serverData.indexOf("successed")>-1?true:false);
就可以了。

具体实现可以参照附件 swfWebTest.rar,这个一个完整的Myeclipse Web项目。

 

 

==================== SWFUpload的cookie Bug ====================

 使用SWFUpload的时候一定要小心cookie bug:在非IE内核内核的浏览器下使用SWFUpload上传文件时,该请求会忽略自身浏览器中的所有cookie,只会将IE浏览器下的属于该域的持久cookie(persistent cookies)发送到服务端,非持久cookie( Session only)不会被发送 。遗憾的是此Bug并非是SWFUpload内部实现的问题(所有的Flash上传都会存在此bug),而是FlashPlayer的bug,所有使用FileReference类上传文件时会存在此问题。幸运的是我们有办法绕开此陷阱。

假设一种使用场景,用户登录系统以后,我们会在cookie中写入一个非持久的key值来判断用户身份。当用户使用SWFUpload上传文件的时候,服务端程序通过Requeset中的cookie来判断用户身份。在IE下我们的功能正常,但在FF下你会发现服务端脚本从Request中取到的 cookie是空的,这就是很多人遇到的cookie丢失。前面我也提到了非IE内核的浏览器忽略了自身的所有cookie。

假如用户同时在IE下登录了另外一个账号,并且选择了记住账号,那么我们的程序逻辑可能会写入一个持久的key值。然后用户在FF下上传照片,服务端是接受到cookie中的key值了,但遗憾的是此key是IE下登录账号的cookie,一不小心这就造成了用户身份判断错误的bug,A用户传了张照片居然是属于B用户的。

解决方法:

幸运的是AS3提供的URLRequest对象来包装客户端请求,我们可以上传文件的同时,给请求添加POST值对。因此当我们的上传程序需要依赖客户端cookie的时候,我们可以在上传开始前使用JS将我们需要的cookie读取出来,然后使用SWFUpload提供的addPostParam方法添加到POST中去,服务端从POST中接受所需要的"cookie"值即可,不再依赖Request中的cookie机制。

 

 

 

  • swfWebTest.rar (67.7 KB)
  • 描述: 一个完整的Myeclipse Web项目
  • 下载次数: 990
分享到:
评论
8 楼 xichucq 2012-05-24  
成功或者失败后怎么把结果传给对应的js?
7 楼 freefly64 2012-04-20  
6 楼 newwpp 2010-06-01  
真好真强大
5 楼 tdqing 2010-05-21  
hunter123456 写道
点击“上传相片”按钮后
状态一直显示等待上传!!

你用第三个例子运行,直接用myeclipse打开就可以。
4 楼 tdqing 2010-05-21  
hunter123456 写道
我三个例子都试了一下,怎么都不行啊,
我的浏览器是ie8,与浏览器没有关系吧?
我的flash_player版本是10。0的!

“一个完整的Myeclipse Web项目”这个项目是可以直接运行的。
3 楼 hunter123456 2010-05-19  
点击“上传相片”按钮后
状态一直显示等待上传!!
2 楼 hunter123456 2010-05-19  
我三个例子都试了一下,怎么都不行啊,
我的浏览器是ie8,与浏览器没有关系吧?
我的flash_player版本是10。0的!
1 楼 lshaohe 2010-05-10  

相关推荐

    swfupload多文件上传带进度条实例

    在这个实例中,我们将探讨如何在VS2012环境下,使用.NET Framework 4.0开发一个基于SWFUpload的多文件上传功能。 首先,让我们理解SWFUpload的工作原理。SWFUpload是基于Flash技术的,它创建了一个隐藏的Flash对象...

    swfupload多文件上传带进度条javaweb项目

    总结,这个"swfupload多文件上传带进度条javaweb项目"提供了完整的文件上传解决方案,结合SwfUpload的强大力量,可以轻松实现批量文件上传并显示进度,对于开发高效、友好的Web应用具有很高的参考价值。通过深入研究...

    基于swfupload的上传实例带进度条

    总的来说,基于SwfUpload的上传实例结合进度条和仿QQ邮箱附件效果,是一个优秀的文件上传解决方案,尤其适合需要大量文件交互的Web应用。通过合理地利用其提供的API和事件机制,开发者可以创建出高效、友好的文件...

    extjs+swfupload实现多文件上传下载删除带进度条

    要实现多文件上传,首先需要在页面中嵌入`SwfUpload`控件,设置允许选择多个文件的参数。然后,通过JavaScript与`SwfUpload`的API交互,监听文件选择、上传开始、上传进度和上传完成等事件。 `ExtJS`的组件模型非常...

    swfupload多文件上传并带有进度条

    SWFUpload是一个经典的JavaScript库,它允许用户在Web页面上实现多文件上传功能,并且具有文件上传进度条显示。这个库特别适用于那些需要处理大量文件上传或者需要展示上传进度的Web应用。以下是对该技术的详细说明...

    extjs swfupload .net 多文件带进度条上传

    SWFUpload是一款基于Flash的文件上传组件,它可以实现在浏览器上无刷新的多文件上传,并且支持文件上传进度显示。它通过Flash插件与JavaScript交互,隐藏了复杂的文件上传细节,让开发者能够轻松处理文件上传操作。...

    Struts+swfupload实现文件上传功能

    Struts和SwfUpload是两种在Web开发中用于构建强大功能的应用工具,它们结合使用可以实现高效的文件上传功能。在本文中,我们将深入探讨这两个组件以及如何将它们整合以实现文件上传。 首先,Struts是一个基于MVC...

    ASP.NET SWFUpload多文件带进度条上传

    在这个特定的场景中,我们讨论的是如何使用SWFUpload库在ASP.NET环境中实现多文件的带进度条上传功能。SWFUpload是一个开源的Flash组件,它允许用户在后台无刷新的情况下进行文件上传,特别适用于大文件上传,同时...

    Extjs3.3+swfUpload2.2实现多文件上传组件.pdf

    该组件的实现主要基于 swfUpload2.2,swfUpload 是一个基于 Flash 的文件上传控件,可以实现多文件上传和进度条显示。Extjs3.3 提供了强大的 UI 组件和事件处理机制,用于与 swfUpload2.2 进行集成。 swfUpload2.2 ...

    SmartUpload+swf实现同时选择多文件上传(带进度条)

    "SmartUpload+swf实现同时选择多文件上传(带进度条)"是一个解决这个问题的方案,它结合了SmartUpload库和SWFUpload技术,提供了一种高效且用户体验良好的多文件上传方式,还附带了进度条显示,使得用户能够实时...

    swfupload+ajax实现多文件上传下载删除并将上传文件上传到数据库

    本教程将详细介绍如何利用`swfupload`和Ajax实现多文件上传、下载、删除,并将上传的文件信息存储到数据库。 首先,`swfupload`是一个开源的文件上传组件,它支持多文件选择、预览、进度条显示等功能。由于Flash在...

    SwfUpload+ssh+easyui实现的文件上传

    在"SwfUpload+ssh+easyui实现的文件上传"这个项目中,开发者首先会使用SwfUpload库来实现前端的文件选择和上传过程。用户选择文件后,SwfUpload会通过Ajax方式将文件信息传递给服务器端。同时,由于SwfUpload是基于...

    JAVA+Struts2+swfupload文件上传下载

    在IT行业中,文件上传下载是Web应用中常见的功能,特别是在涉及到用户交互和数据交换的系统中。本项目基于JAVA、Struts2框架以及swfupload插件,提供了一个完整的文件上传下载解决方案。以下是对这个项目的详细解读...

    struts2+swfupload实现大文件多文件上传

    Struts2和SwfUpload是两个在Web开发中用于处理用户交互的重要工具,它们结合使用可以实现高效的大文件和多文件上传功能。Struts2是一个基于MVC(Model-View-Controller)架构的Java框架,它提供了强大的控制层支持,...

    SpringMvc+SWFUpload实现文件异步上传

    SWFUpload支持多文件选择、进度条显示和取消上传等特性,使得文件上传更加直观和友好。 在结合Spring MVC和SWFUpload实现异步上传时,首先需要在前端HTML页面上配置SWFUpload插件。`index.html`文件中通常会包含...

    swfupload多文件上传jsp+servlet(SSH可用)

    SwfUpload是一款强大的JavaScript文件上传组件,它支持多文件上传功能,且在Web应用程序中广泛使用。本项目结合了jsp和servlet技术,同时也提供了与SSH框架的集成,使得文件上传功能可以在各种Java Web项目中无缝...

    jqeury插件(demo)+图片上传(swfupload)

    而swfupload则是一个较旧的文件上传插件,它利用Flash技术实现异步多文件上传。 1. **jQuery插件**: - jQuery的核心功能包括选择器(用于选取HTML元素)、DOM操作(添加、删除、修改元素)、事件处理(绑定和触发...

    SWFUpload实现多文件上传

    SWFUpload是一个开源的JavaScript库,它允许网页在Flash的支持下实现高级的文件上传功能,包括多文件选择、进度条显示、预览等。在Web开发中,尤其是在处理大量图片或者文档上传时,SWFUpload提供了高效且用户体验...

    SwfUpload多文件上传

    SwfUpload是一款经典的Flash-based文件上传组件,它允许用户在网页上实现多文件同时上传的功能。SwfUpload因其良好的用户体验和高效性能,在过去的几年里被广泛应用于各种网站和应用程序。Struts1则是一个古老的但...

    swfupload+fileupload文件批量上传,带进度条百分比显示

    在描述中提到的项目,显然利用了SWFUpload与FileUpload的组合,来实现带有进度条百分比显示的文件批量上传功能,并且可以在Eclipse环境中直接运行,这通常意味着该项目是一个基于Java的Web应用。 1. **SWFUpload...

Global site tag (gtag.js) - Google Analytics