要下载文件,首先要获取文件列表
创建action
public class DownloadAction extends ActionSupport{
private File[] files;
public String list(){
//取得文件保存路径
String path=ServletActionContext.getServletContext().getRealPath("/download");
File f=new File(path);
//获取目录下保存的文件
files=f.listFiles();
return "list";
}
//省略get/set
}
配置struts.xml
<action name="*down" class="base.DownloadAction " method="{1}">
<result name="list">/filelist.jsp</result>
</action>
浏览器输入listdown.action请求跳转到文件下载列表页面
前台页面显示,filelist.jsp
<body>
<c:forEach items="${files }" var="f">
${f.name}<a href="download.action?fileName=${f.name }">下载</a><br>
</c:forEach>
</body>
点击下载链接,将文件名传入后台,
修改action代码
public class DownloadAction extends ActionSupport{
private File[] files;
private String fileName;
public String list(){
//取得文件保存路径
String path=ServletActionContext.getServletContext().getRealPath("/download");
File f=new File(path);
//获取目录下保存的文件
files=f.listFiles();
return "list";
}
public InputStream getDownloadFile() throws Exception{
String filePath = ServletActionContext.getRequest()
.getServletContext().getRealPath("/download/"+fileName);
InputStream is = new FileInputStream(new File(filePath));
return is;
}
public void setFileName(String fileName) throws UnsupportedEncodingException {
//处理get请求中文乱码
this.fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
}
public File[] getFiles() {
return files;
}
public void setFiles(File[] files) {
this.files = files;
}
public String getFileName() {
return fileName;
}
}
修改struts.xml文件
<action name="*down" class="base.DownloadAction" method="{1}">
<result name="list">/index.jsp</result>
</action>
<action name="download" class="base.DownloadAction" >
<result type="stream">
<!-- 下载的文件数据存放的方法,该方法返回一个InputStream
例如取值为inputStream的属性需要编写getInputStream()方法-->
<param name="inputName">downloadFile</param>
<!--下载时,客户端显示的下载的文件名 -->
<param name="contentDisposition"> attachment; filename=${fileName}</param>
<!-- 数据的缓冲大小 -->
<param name="bufferSize">1024</param>
</result>
</action>
其中attachment;filename=${fileName},设置浏览器以下载的方式打开文件,文件下载的时候保存的名字应为${fileName},如果直接写filename=${fileName},那么默认情况是代表inline,浏览器会尝试自动打开它,
等价于这样的写法:inline; filename=${fileName}