| public void decode(FacesContext context, UIComponent component) { UIFileUpload input = (UIFileUpload) component; //检查是否这是一个上传进度请求,或是一个实际的上传请求. ExternalContext extContext = context.getExternalContext(); Map parameterMap = extContext.getRequestParameterMap(); String clientId = input.getClientId(context); Map requestMap = extContext.getRequestParameterMap(); if(requestMap.get(clientId) == null){ return;//什么也不做,返回 } if(parameterMap.containsKey(PROGRESS_REQUEST_PARAM_NAME)){ //这是一个在该文件请求中的得到进度信息的请求. //得到该进度信息并把它生成为XML HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse(); //设置响应的头信息 response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); try { ResponseWriter writer = FacesUtils.setupResponseWriter(context); writer.startElement("progress", input); writer.startElement("percentage", input); //从会话中获得当前进度百分数(由过滤器所设置). Double progressCount = (Double)extContext.getSessionMap(). get("FileUpload.Progress." +input.getClientId(context)); if(progressCount != null){ writer.writeText(progressCount, null); }else{ writer.writeText("1", null);//我们还没有收到上传 } writer.endElement("percentage"); writer.startElement("clientId", input); writer.writeText(input.getClientId(context), null); writer.endElement("clientId"); writer.endElement("progress"); } catch(Exception e){ //做一些错误记录... } }else{ //正常的译码请求. ... |
| //正常的译码请求. if(requestMap.get(clientId).toString().equals("file")){ try{ HttpServletRequest request = (HttpServletRequest)extContext.getRequest(); FileItem fileData = (FileItem)request.getAttribute(clientId); if(fileData != null) input.setSubmittedValue(fileData); //现在我们需要清除与该项相关的任何进度 extContext.getSessionMap().put("FileUpload.Progress." + input.getClientId(context),new Double(100)); }catch(Exception e){ throw new RuntimeException("不能处理文件上传" +" - 请配置过滤器.",e); } } |
| function refreshProgress(){ // 假定我们正在进入到阶段2. document.getElementById('fileUpload1_stage1').style.display = 'none'; document.getElementById('fileUpload1_stage2').style.display = ''; document.getElementById('fileUpload1_stage3').style.display = 'none'; //创建AJAX寄送 AjaxRequest.post( { //指定正确的参数,以便 //该组件在服务器端被正确处理 'parameters':{ 'uploadForm':'uploadForm', 'fileUpload1':'fileUpload1', 'jsf.component.UIFileUpload':'1', 'ajax.abortPhase':'4' } //Abort at Phase 4. //指定成功处理相应的回调方法. ,'onSuccess':function(req) { var xml = req.responseXML; if( xml.getElementsByTagName('clientId').length == 0) { setTimeout('refreshProgress()',200); return; } var clientId = xml.getElementsByTagName('clientId'); clientId = clientId[0].firstChild.nodeValue + '_progressBar'; //从XML获取百分比 var percentage = xml.getElementsByTagName('percentage')[0].firstChild.nodeValue; var innerSpans = document.getElementById(clientId).getElementsByTagName('span'); document.getElementById(clientId + 'label').innerHTML = Math.round(percentage) + '%'; //基于当前进度,设置这些span的式样类。 for(var i=0;i<innerSpans.length;i++){ if(i < percentage){ innerSpans[i].className = 'active'; }else{ innerSpans[i].className = 'passive'; } } //如果进度不是100,我们需要继续查询服务器以实现更新. if(percentage != 100){ setTimeout('refreshProgress()',400); } else { //文件上传已经完成,我们现在需要把该组件送入到第3个阶段. document.getElementById('fileUpload1_stage1').style.display = 'none'; document.getElementById('fileUpload1_stage2').style.display = 'none'; document.getElementById('fileUpload1_stage3').style.display = ''; } } }); } return builder.toString(); |