2.火狐浏览器上,uploadify文件上传不兼容,和session重新发起的问题

前段时间做表单中有文件上传的功能,主要是因为用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();
        }
    }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。