前段时间做表单中有文件上传的功能,主要是因为用uploadify上传,发生了问题:
问题描述1:用uploadify实现文件上传时,遇到在火狐上不兼容问题,uploadify样式无法加载的问题,这个简单,直接在火狐浏览器上安装flash插件就可以了解决,
问题描述2:使用uploadify上传文件时,发现上传文件的session(以下就叫file_session)和提交表单的session(sub_session)不一样。在提交表单的Action中我们想要获取之前的请求在session设置的值时,获取到的都是null,因为两次请求的session已经不一样了。(chrome,ie请求的sessionid是一样的)
解决思路:因此我们肯定也无法在提交表单的Action里面获取到上传文件时候session里面的数据了。那么就只能通过把file_session的sessionid传到表单提交的请求里面,然后通过file_sessionid去获取file_session并取到里面的数据。
1.首先我们需要通过sessionid获取session的方法,因为Servlet2.1之后不支持SessionContext里面getSession(String id)方法。so,看我的上一篇去,这就不重复写了。
上代码
jsp文件上传:
var sid;//图片上传临时文件成功后返回的sessionid $("#uploadify").uploadify({ 'swf' : '<%=basePath%>/Backstage/Style/jQuery-uploadify/uploadify.swf?time='+Math.random(), // 'script' : 'ProductAction!fileUpload.do',//后台处理的请求 'uploader': 'AppVersionAction!fileUpload.do' , 'cancelImg' : '<%=basePath%>/Backstage/include/easyvalidator/images/vtip_arrow.png', 'formData':{'ASPSESSID':sessionid}, 'folder' : '/uplaod/temp',//您想将文件保存到的路径 'queueID' : 'fileQueue',//与下面的id对应 'fileObjName':'uploadify', 'queueSizeLimit' : 5, 'fileDesc' : '文件格式', 'fileTypeExts' : '*.apk;*.ipa;*.png', //控制可上传文件的扩展名,启用本项时需同时声明fileDesc 'auto' : false, 'simUploadLimit' : 2, 'buttonText' : '选择文件', 'onQueueComplete' : function(file,data,response) { }, 'onUploadSuccess':function(file,data,response){ sid=data;//获取文件上传后传到页面的sessionid } });
jsp表单提交:
//提交处理 function toSubmit(){ //验证全部通过,提交表单 if($("#moduleform").form("validate")){ etc.submitForm('/AppVersionAction!modVersion.do?sessionid='+sid,'1');//这样就可以在表单提交的时候将文件上传时的sessionid传到提交的请求中 } }
Action中,文件上传方法:
public void fileUpload() throws Exception { UploadImg uploadImg = new UploadImg(); List<String> files; System.out.println("##fileUpload- sessionid:"+getRequest().getSession().getId()); if (getSession().getAttribute("files") != null) { files = (List<String>) getSession().getAttribute("files"); } else { files = new ArrayList<String>(); } for (int i = 0; i < uploadify.length; i++) { // 存入文件缓存目录 String returnURL = uploadImg.getUploadImgSaveUrl(getRequest(), uploadify[i], uploadify[i].getName(), "/Upload/temp"); files.add(returnURL.substring(returnURL.lastIndexOf("/"), returnURL.length())); } if(files!=null){ getSession().setAttribute("uploadifyFileName", uploadifyFileName); } getSession().setAttribute("files", files); System.out.println("#### filename session: "+getSession().getAttribute("fileName1")); // 封装成JSON格式返回页面 String json = JSON.toJSONString(uploadify); getResponse().setContentType("text/html;charset=utf-8");// 设置输出流格式,编码为utf-8 getResponse().getWriter().println(getRequest().getSession().getId());// 在这主要将文件上传这边的session传到表单提交页面。 }
Action中表单提交的方法:
public void modVersion() { UploadImg uploadImg=new UploadImg(); String sessionId =getRequest().getParameter("sessionid"); System.out.println(" mod sid: "+sessionId); HttpSession session = MySessionContext.getSession(sessionId);//获取fileupload文件时的session,进而获取临时文件信息,在上一篇文章中有对应代码 List<String> files = (List<String>) session.getAttribute("files");//这里我们就可以获取在fileUplad()的请求时session。 try { 。。。//代码就省了,主要是要说session获取的问题 } catch (IOException e) { e.printStackTrace(); } }