strtus2 批量下载 中文问题、压缩文件等 ------ 讨论struts2工作流程

       最近因为一个项目,需要做统一的下载,并且要支持批量下载..其中涉及到的知识点有:get请求中文处理,下载动态设置下载名,批量下载,动态打包,流处理,删除临时文件,使用迅雷下载后台发出两次次下载请求,以及struts2工作流程与原理等..
       
       下面是我自己做的一个实例,主要实现遍历一个文件夹生成下载列表,用户可以单一下载,也可选择相关文件批量下载.....做的其中发现有很多疑惑的地方,请高手们指出....谢谢
      
      一.实例区
      1.index.html
      

<% @ page language = " java "  pageEncoding = " gbk " %>
<%
String  path  =  request.getContextPath();
String  basePath  =  request.getScheme() + " :// " + request.getServerName() + " : " + request.getServerPort() + path + " / " ;
%>

<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
  
< head >
    
< base  href ="<%=basePath%>" >
    
    
< title > My JSP 'index.jsp' starting page </ title >
    
< meta  http-equiv ="pragma"  content ="no-cache" >
    
< meta  http-equiv ="cache-control"  content ="no-cache" >
    
< meta  http-equiv ="expires"  content ="0" >     
    
< meta  http-equiv ="keywords"  content ="keyword1,keyword2,keyword3" >
    
< meta  http-equiv ="description"  content ="This is my page" >
    
<!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    
-->
  
</ head >
  
  
< body >
           
< hr >
           
< h3 > 欢迎光临下载区 </ h3 >
           
< href ="downloadList.action" > 下载列表 </ a >< br />
  
</ body >
</ html >

      2.配置struts.xml
      

<? xml version="1.0" encoding="UTF-8"  ?>
<! DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>
< struts >


    
< constant  name ="struts.custom.i18n.resources"  value ="message" ></ constant >
    
< constant  name ="struts.i18n.encoding"  value ="gbk" ></ constant >
    
< constant  name ="struts.multipart.saveDir"  value ="/tmp" ></ constant >
    
< constant  name ="struts.multipart.maxSize"  value ="209715200"   />
    
    
< package  name ="struts2"  extends ="struts-default" >
    
    
        
< action  name ="downloadList"  class ="cn.edu.cuit.disasterSystem.web.struts2.action.DownloadListAction" >
            
< result  name ="success" > /downloadList.jsp </ result >
            
< result  name ="error" > /downloadListError.jsp </ result >         
        
</ action >
    
    
        
            
< action  name ="download"  class ="cn.edu.cuit.disasterSystem.web.struts2.action.DownloadAction" >
            
< result  name ="success"  type ="stream" >
                
<!--  contentType为二进制方式  -->
                
< param  name ="contentType" > application/octet-stream;charset=ISO8859-1 </ param >
                
<!--  attachment属性强调是下载,就不会主动打开,比如图片  -->
                
<!--  使用经过转码的文件名作为下载文件名,downloadFileName属性对应action类中的方法 getDownloadFileName()  -->
                
< param  name ="contentDisposition" >
                    attachment;filename=${filename}
                
</ param >
                
< param  name ="inputName" > downloadFile </ param >
                
< param  name ="bufferSize" > 4096 </ param >
            
</ result >
            
< result  name ="input" > /downloadList.jsp </ result >
            
< result  name ="error" > /downloadListError.jsp </ result >
        
</ action >
    
</ package >
</ struts >

      3.产生下载列表的Action----DownloadListAction

package  cn.edu.cuit.disasterSystem.web.struts2.action;

import  java.io.File;
import  java.util.ArrayList;
import  java.util.HashMap;
import  java.util.Map;

import  org.apache.struts2.ServletActionContext;

import  com.opensymphony.xwork2.ActionContext;
import  com.opensymphony.xwork2.ActionSupport;

/**
 * 显示所有down目录的文件,供下载所用
 * 
@author   xcp
 * 
@version   1.0
 * Copyright (C), 2009 智能开发实验室 所有
 * Program Name:灾情信息管理系统
 * Date: 2009-10-24 上午11:16:41
 
*/
@SuppressWarnings(
" serial " )
public   class  DownloadListAction   extends  ActionSupport{
    
    
private   static  ArrayList < String >  filelist  =   new  ArrayList < String > ();
    
    
    
/**
     *    可以是前台一个页面传入,也可以是手动指定,其作用是指定下载文件的根目录
     * 
@author   向才鹏
     * 2009-10-24 下午12:02:47
     
*/
    
private  String downloadRootPath  =   " /upload " ;
    
    
public  String getDownloadRootPath() {
        
return  downloadRootPath;
    }
    
public   void  setDownloadRootPath(String downloadRootPath) {
        
this .downloadRootPath  =  downloadRootPath;
    }


    
/**
     * 将指定文件路径下的文件全部遍历出来 
     * 
@author  向才鹏
     * 
@param  strPath 指来要遍历的文件
     * 2009-10-24   下午12:04:48
     
*/
    
public   static   void  refreshFileList(String strPath)
    {
        File dir 
=   new  File(strPath);
        File[] files 
=  dir.listFiles();

        
if  (files  ==   null )
            
return ;
        
for  ( int  i  =   0 ; i  <  files.length; i ++ )
        {
            
if  (files[i].isDirectory())
            {
                refreshFileList(files[i].getAbsolutePath());
            } 
else
            {
                String filePath 
=   files[i].getPath();
                filelist.add(filePath);
            }
        }
    }

    
    
    
/**
     * 格式化输出数据存入Map,形式文件名+文件服务端路径
     * 
@author  向才鹏
     * 
@param  filelist 遍历出来的文件路径
     * 
@param  downloadRootPath 指明服务器下载的文件,便于从遍历出来的文件中取得服务端路径
     * 
@return
     * 2009-10-24   下午12:06:18
     
*/
    
private   static  Map < String,String >  formatFileMap(ArrayList < String >  filelist,String downloadRootPath){
        Map
< String,String >  formatFileMap  =   new  HashMap < String,String > ();
        
// 得到服务下载的根路径,并将/换成\\,这样便于替换
        String formatDownloadRootPath  =   downloadRootPath.replaceAll( " / " " \\\\ " );
        
for (String filePath : filelist){
            
// 得到下载的相对路径
            String  downloadPath  =  filePath.substring(filePath.indexOf(formatDownloadRootPath));
            
// 将得到的相对路径的\\转换成/
            String formatDownloadPath  =  downloadPath.replaceAll( " \\\\ " " / " );
            
// 得到文件名
            String filename  =  formatDownloadPath.substring(formatDownloadPath.lastIndexOf( " / " ) + 1 );
        
            
/* try {
                formatFileMap.put(filename, URLEncoder.encode(formatDownloadPath, "gbk"));
            } catch (UnsupportedEncodingException e) {
                formatFileMap.put(filename, formatDownloadPath);
                e.printStackTrace();
            }
*/
            
            
// 这就不用考虑设置编码了,再后面统一使用javascript的encodeURI函数
            formatFileMap.put(filename, formatDownloadPath);
            
        }
        
return  formatFileMap;
    }
    
    
    @SuppressWarnings(
" unchecked " )
    @Override
    
public  String execute()  throws  Exception {
        
        
// 指定下载目录
        String upload  =  ServletActionContext.getServletContext().getRealPath(downloadRootPath);
        
// 清理filelist
        filelist.clear();
        
// 遍历文件
        refreshFileList(upload);
        
        ActionContext context 
=  ActionContext.getContext();
        Map request 
=  (Map) context.get( " request " );
        
        
        
if (filelist  !=   null ){
            
// 格式化文件信息,包括文件名和地址
            Map < String,String >  formatFileMap  =  formatFileMap(filelist,downloadRootPath);
            request.put(
" fileMap " , formatFileMap);
            
return  SUCCESS;
        }
        
else {
            request.put(
" errorMessage " " 没有相关的下载文件 " );
            
return  ERROR;
        }
            
    }
    
    
}

      4.显示下载列表downloadList.jsp

<% @ page language = " java "  contentType = " text/html; charset=gbk "
    pageEncoding
= " gbk " %>

<% @ taglib prefix = " s "  uri = " /struts-tags " %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< script  type ="text/javascript" >
    
function  downloadFile1(filenames,filepaths){
        location.href
= encodeURI( " download.action?filenames= " + filenames + " &filepaths= " + filepaths);
    }
    
function  SelectAll(oForm)
    {
        
for ( var  i = 0 ;i < oForm.url.length;i ++ )
        {
            oForm.url[i].checked
= true ;
        }
    }
    
function  TurnOver(oForm)
    {
        
for ( var  i = 0 ;i < oForm.url.length;i ++ )
        {
            oForm.url[i].checked
=! oForm.url[i].checked;
        }
    }
    
function  DownlodSelected(oForm){
         
if (confirm( " 因需要在服务端动态打包,需要时间比较长,是否继续批量下载? " ))
            {
             
var  arrDownloadList  =  [];
            
for ( var  i = 0 ;i < oForm.url.length;i ++ ){
                
if (oForm.url[i].checked == true ){
                    
if (arrDownloadList.length == 0 ){
                        arrDownloadList[
0 =  oForm.url.value;
                    }
                    arrDownloadList[arrDownloadList.length] 
=  oForm.url[i].value;
                }
            }
            
if  (arrDownloadList.length > 0 ){
                
var  temp  =  [];
                
var  filenames = "" ;
                
var  filepaths = "" ;
                
for ( var  i = 1 ;i < arrDownloadList.length;i ++ ){
                    temp 
=  arrDownloadList[i].split( " , " )
                    
if (filenames == ""   &&  filepaths == "" ){
                        filenames
= temp[ 0 ]
                        filepaths
= temp[ 1 ]
                    }
else {    
                        filenames
= filenames + " | " + temp[ 0 ];
                        filepaths
= filepaths + " | " + temp[ 1 ];
                    }
                }
                downloadFile1(filenames,filepaths);
            }
else {
                alert(
" 还没有选中下载项 " );
            }
           }
    }
</ script >
< html >
    
< head >
        
< meta  http-equiv ="Content-Type"  content ="text/html; charset=GB18030" >
        
< title > Insert title here </ title >
        
< script  type ="text/javascript"  src ="dwr/engine.js" ></ script >
        
< script  type ="text/javascript"  src ="dwr/util.js" ></ script >
        
< script  type ="text/javascript"  src ="dwr/interface/downloaddwr.js" ></ script >
    
</ head >
    
< body >
        
< form  name ="myform"  style ="display: inline"  onSubmit ="return false" >
            
< table  width ="50%"  align ="center" >
                
< tr >
                    
< td  colspan ="2" >
                        
< h3 >
                            以后是下载列表,点击进行下载
                        
</ h3 >
                    
</ td >
                
</ tr >
                
< tr >
                    
< td  colspan ="2" >
                        
< font  color ="red" >< s:fielderror ></ s:fielderror >   </ font >
                    
</ td >
                
</ tr >
                
< s:iterator  value ="#request.fileMap"  status ="stuts" >
                    
< s:if  test ="#stuts.odd == true" >
                        
< tr  style ="background-color: #77D9F6" >
                            
< td >
                                
< input  name ="url"  type ="checkbox"  id ="url"
                                    value
="<s:property value=" key"  /> , < s:property  value ="value"   /> ">
                            
</ td >
                            
< td >
                                
< s:property  value ="key"   />
                            
</ td >
                            
< td >
                                
< href ="#"
                                    onclick
="downloadFile1('<s:property value=" key"  /> ',' < s:property  value ="value"   /> ')">点击下载 </ a >
                            
</ td >
                        
</ tr >
                    
</ s:if >
                    
< s:else >
                        
< tr  style ="background-color: #D7F2F4" >
                            
< td >
                                
< input  name ="url"  type ="checkbox"  id ="url"
                                    value
="<s:property value=" key"  /> , < s:property  value ="value"   /> ">
                            <
分享到:
评论
1 楼 dongzi0098 2010-06-07  
看不全啊

你可能感兴趣的:(JavaScript,工作,jsp,struts,DWR)