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();

        }

    }

 

你可能感兴趣的:(uploadify)