以前希望考研,对所用到的东西都是浅尝辄止。现在突然觉得考研的决定是自己失去了好多好多,人就应该面对现实,面对责任,而不是追求梦想而脱离实际。废话不多说了,让我分享一下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; }