接上篇Struts2使用注解实现文件的上传与下载(一),这次介绍使用注解实现文件下载,基本配置与之前的一样,这里重点讲下载的Action写法。
文件下载的Action:DownloadAction.java
package com.figo.action;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.convention.annotation.Result;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Validateable;
import com.opensymphony.xwork2.ValidationAwareSupport;
/**
* 所下载文件相关的的几个属性:文件格式 contentType,
* 获取文件名的方法inputName,
* 文件内容(显示的)属性contentDisposition,
* 限定下载文件 缓冲区的值bufferSize
* */
@Results({ @Result(name = "success", type = "stream", params = { "contentType",
"application/octet-stream;charset=ISO8859-1", "inputName",
"inputStream", "contentDisposition",
"attachment;filename=\"Readme.txt\"", "bufferSize", "4096" }) })
public class DownloadAction extends ActionSupport {
private static final long serialVersionUID = 8784555891643520648L;
private String STORAGEPATH = "/upload/Readme.txt";
private String fileName;// 初始的通过param指定的文件名属性
private String storageId;
private String inputPath;// 指定要被下载的文件路径
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
public String getStorageId() {
return storageId;
}
public void setStorageId(String storageId) {
this.storageId = storageId;
}
// 如果下载文件名为中文,进行字符编码转换
public String getDownloadFileName() {
String downloadFileName = fileName;
try {
downloadFileName = new String(downloadFileName.getBytes(),
"ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downloadFileName;
}
public InputStream getInputStream() throws Exception {
/**
* 下载用的Action应该返回一个InputStream实例,
* 该方法对应在result里的inputName属性值为targetFile
**/
return ServletActionContext.getServletContext().getResourceAsStream(
STORAGEPATH);
}
public String execute() throws Exception {
return SUCCESS;
}
}
代码其实很简单,最关键的就是getInputStream()方法,返回一个InputStream实例,还有就是@Results的配置。
测试页面:download.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Download</title>
</head>
<body>
<s:a href="download.action">Download</s:a>
</body>
</html>
结果如下:
最后附代码:http://download.youkuaiyun.com/detail/sxwyf248/4462899