以前希望考研,对所用到的东西都是浅尝辄止。现在突然觉得考研的决定是自己失去了好多好多,人就应该面对现实,面对责任,而不是追求梦想而脱离实际。废话不多说了,让我分享一下struts2下载时候参数的配置。
1。annotation实现
@Results( { @Result(name = "success", type = "stream", params = {
"contentType", "application/octet-stream;charset=ISO8859-1",
"inputName", "inputStream",
"contentDisposition","attachment;filename=\"${fileName}\"",
"bufferSize", "4096"
})
})
2。xml配置
<action name="download" class="com.lizw.FileDownloadAction">
<result name="success" type="stream">
<param name="inputName">inputStream</param>
<param name="contentType">application/octet-stream</param>
<param name="contentDisposition">filename=${fileName}</param>
<param name="bufferSize">2048</param>
</result>
</action>
下面针对各个参数详细解释一下:
contentType :
内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片
inputName :
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法
contentDisposition :
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值
为:
attachment;filename="readme.txt",表示文件下载的时候保存的名字应为
readme
.txt。如果直接写filename="
readme
.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="
readme
.txt"
bufferSize :
下载缓冲区的大小
对struts2下载流的理解:
action中定义一个返回InputStream的方法,该方法作为被下载文件的入口,且需要配置stream类型结果时指定inputName参数,inputName参数的值就是方法去掉get前缀、首字母小写的字符串。
对应的核心Java代码:
// 如果下载文件名为中文,进行字符编码转换
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;
}