解决SWFUpload上传控件在非IE浏览器下不好用的问题,主要是两点:一点是请求路径,一点是网上说的session的问题。
第一:路径问题
SWFUploa控件的upload_url必须是绝对路径。
如我的项目链接为:http://127.0.0.1:8080/TestWeb,进行文件上传的servlet为uploadServlet,那么upload_url就必须为:http://127.0.0.1:8080/TestWeb/uploadServlet
若只是写upload_url:uploadServlet,IE(IE11没试过)能用,非IE的(如谷歌、火狐、360)都是404。
第二:sessionid丢失的问题
这个问题如果后台不需要session验证其实也不是什么问题,但是要验证呢就是个问题了。
这个问题谷歌不明显,路径问题解决了谷歌浏览器还是可以上传的。
火狐彻底不行,原因就是网上说:sessionid丢失了。
所以只需要在文件上传时把sessionid带过来再通过sessionid把原来的session找回来问题就解决了。具体解决如下:
第一步、建立一个全局map用来存放session:
public class MySessionContext { private static MySessionContext instance; private HashMap mymap; private MySessionContext() { mymap = new HashMap(); } public static MySessionContext getInstance() { if (instance == null) instance = new MySessionContext(); return instance; } public synchronized void AddSession(HttpSession session) { if (session != null) mymap.put(session.getId(), session); } public synchronized void DelSession(HttpSession session) { if (session != null)mymap.remove(session.getId()); } public synchronized HttpSession getSession(String session_id) { if (session_id == null) return null; return (HttpSession) mymap.get(session_id); } }
第二步、建一个session监听器,当session创建和销毁的时候map中随之添加删除session:
public class MySessionListener implements HttpSessionListener{ private MySessionContext myc=MySessionContext.getInstance(); public void sessionCreated(HttpSessionEvent arg0) { myc.AddSession(arg0.getSession()); } public void sessionDestroyed(HttpSessionEvent arg0) { myc.DelSession(arg0.getSession()); } }
在web.xml中注册这个监听器:
<listener> <display-name>MySessionListener</display-name> <listener-class>com.wjl.MySessionListener</listener-class> </listener>
第三步、在文件上传路径中把sessionid传过来:
var sessionid = '<%=session.getId()%>'; var serverURL='<%=basePath%>'; upload_url: serverURL+'uploadServlet?jsessionid='+sessionid
第四步、在后台需要验证session的时候重新生成session:
Object userInfo = request.getSession().getAttribute("userInfo"); if (userInfo == null){ String sessionID = request.getParameter("jsessionid"); if(sessionID!=null && sessionID.trim().length()>0 && (!sessionID.trim().equalsIgnoreCase("null"))){//说明session有传值 HttpSession sess = MySessionContext.getInstance().getSession(sessionID); userInfo = sess.getAttribute("userInfo"); if(userInfo==null){ throw new Exception("用户信息获取失败:userInfo=null"); } } }
这样子之后,用户验证就通过了,自然也就不会空指针,也就能上传文件啦。
相关推荐
为了实现SwfUpload控件的完整功能,开发者需要将这些组件整合到自己的项目中,配置JavaScript和服务器端代码以处理文件上传的逻辑。这通常涉及设置上传URL、指定文件类型限制、处理文件大小限制、以及添加自定义的...
SWFUpload不同于其他基于Flash构建的上传工具,它有着优雅的代码设计,开发者可以利用XHTML、CSS和JavaScript来随心所欲的定制它在浏览器下的外观;它还提供了一组简明的JavaScript事件,借助它们开发者可以方便的...
SWFUpload是一款强大的JavaScript上传组件,它通过Flash技术实现了非IE浏览器下的文件上传功能,同时在IE下也能提供良好的用户体验。这个"SWFUpload上传实例"是一个已经调试完毕且可以直接在Myeclipse环境下引用的...
3. **PIE.js**:这是一个CSS3渲染引擎,用于解决IE浏览器对某些CSS3属性的不支持,可能用于美化上传按钮的样式。 4. **jquery.ad-gallery.js**:这可能是一个图片画廊插件,虽然不是直接用于文件上传,但可以用于...
SWFUpload是一款强大的文件上传组件,尤其在网页前端文件上传领域具有广泛的运用。这款插件以其优秀的用户体验和灵活的功能配置,赢得了开发者的喜爱。在本文中,我们将深入探讨SWFUpload的工作原理、特点以及如何在...
在非IE浏览器中,HTML5的`<input type="file">`标签提供了文件选择和上传的功能,配合AJAX可以实现异步上传,用户体验良好。然而,IE7、8、9由于其对HTML5特性的不完全支持,这种方案往往无法直接应用。 首先,要...
2. **The KillersAjax Upload**:这个插件利用XMLHttpRequest(XHR)进行文件上传,显示上传进度,但不适用于IE浏览器。 3. **SWFUpload jQuery Plugin**:基于Flash的上传插件,提供了文件上传和进度显示功能。 4...
6.5.2.10 Combo扩展1-去除IE6下穿透层的bug 129 6.5.2.10.1 效果 130 6.5.2.11 Combo扩展2-新样式、可多选 131 6.5.2.11.1 效果 131 6.5.2.12 Combo扩展3-ComboGrid 134 6.5.2.12.1 效果 134 6.5.2.13 Combo扩展4-...
该插件基于XMLHttpRequest(XHR)技术,支持多文件上传,并可以显示上传进度,但不支持旧版IE浏览器。 3. Uploadify Uploadify是一款基于jQuery的文件上传插件,它支持单文件或多文件上传,并允许控制并发上传文件的...