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

最近因为一个项目,需要做统一的下载,并且要支持批量下载..其中涉及到的知识点有:get请求中文处理,下载动态设置下载名,批量下载,动态打包,流处理,删除临时文件,使用迅雷下载后台发出两次次下载请求,以及struts2工作流程与原理等..

下面是我自己做的一个实例,主要实现遍历一个文件夹生成下载列表,用户可以单一下载,也可选择相关文件批量下载.....做的其中发现有很多疑惑的地方,请高手们指出....谢谢

一.实例区
1.index.html

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

<! DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN" >
< html >
< head >
< base href ="<%=basePath%>" >

< title > MyJSP'index.jsp'startingpage </ 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 ="Thisismypage" >
<!--
<linkrel="stylesheet"type="text/css"href="styles.css">
-->
</ head >

< body >
< hr >
< h3 > 欢迎光临下载区 </ h3 >
< a href ="downloadList.action" > 下载列表 </ a >< br />
</ body >
</ html >

2.配置struts.xml

<? xmlversion="1.0"encoding="UTF-8" ?>
<! DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.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智能开发实验室所有
*ProgramName:灾情信息管理系统
*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 StringdownloadRootPath = " /upload " ;

public StringgetDownloadRootPath(){
return downloadRootPath;
}
public void setDownloadRootPath(StringdownloadRootPath){
this .downloadRootPath = downloadRootPath;
}


/**
*将指定文件路径下的文件全部遍历出来
*
@author 向才鹏
*
@param strPath指来要遍历的文件
*2009-10-24下午12:04:48
*/
public static void refreshFileList(StringstrPath)
{
Filedir
= 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
{
StringfilePath
= 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,StringdownloadRootPath){
Map
< String,String > formatFileMap = new HashMap < String,String > ();
// 得到服务下载的根路径,并将/换成\\,这样便于替换
StringformatDownloadRootPath = downloadRootPath.replaceAll( " / " , " \\\\ " );
for (StringfilePath:filelist){
// 得到下载的相对路径
StringdownloadPath = filePath.substring(filePath.indexOf(formatDownloadRootPath));
// 将得到的相对路径的\\转换成/
StringformatDownloadPath = downloadPath.replaceAll( " \\\\ " , " / " );
// 得到文件名
Stringfilename = formatDownloadPath.substring(formatDownloadPath.lastIndexOf( " / " ) + 1 );

/* try{
formatFileMap.put(filename,URLEncoder.encode(formatDownloadPath,"gbk"));
}catch(UnsupportedEncodingExceptione){
formatFileMap.put(filename,formatDownloadPath);
e.printStackTrace();
}
*/

// 这就不用考虑设置编码了,再后面统一使用javascript的encodeURI函数
formatFileMap.put(filename,formatDownloadPath);

}
return formatFileMap;
}


@SuppressWarnings(
" unchecked " )
@Override
public Stringexecute() throws Exception{

// 指定下载目录
Stringupload = ServletActionContext.getServletContext().getRealPath(downloadRootPath);
// 清理filelist
filelist.clear();
// 遍历文件
refreshFileList(upload);

ActionContextcontext
= ActionContext.getContext();
Maprequest
= (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

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

<% @taglibprefix = " s " uri = " /struts-tags " %>
<! DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//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 > Inserttitlehere </ 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 ="returnfalse" >
< 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:propertyvalue=" key" /> , < s:property value ="value" /> ">
</ td >
< td >
< s:property value ="key" />
</ td >
< td >
< a href ="#"
onclick
="downloadFile1('<s:propertyvalue=" 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:propertyvalue=" key" /> , < s:property value ="value" /> ">
</ td >
< td >
< s:property value ="key" />
</ td >

< td >
< a href ="#"
onclick
="downloadFile1('<s:propertyvalue=" key" /> ',' < s:property value ="value" /> ')">点击下载 </ a >
</ td >
</ tr >
</ s:else >
</ s:iterator >
</ table >
< div align ="center" >
< input class ="green_at_bn" title ="选择下载的文件"
onClick
="SelectAll(this.form)" type ="button" value ="全选" >
< input class ="green_at_bn" title ="反向选择下载文件"
onClick
="TurnOver(this.form)" type ="button" value ="反选" >
< input
分享到:
评论

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