jsp实现寥寥几句代码 :a标签嵌个流,点击便可实现。那么extjs的下载又是怎个样子呢?没有了a标签,我们如何定位流路径呢?如何根据文件类型找到并生成相应流?
如何配置定义格式,使我们下载的文件后缀是我们想要的类型?
借鉴一个具体实例,分析解答以上困惑
首先,前台ext页面 ext tbar 实现如下:
var tbar = new Ext.Toolbar({ items : [{ text : ‘下载附件‘, tooltip : ‘下载一条合同记录的附件‘, iconCls : ‘item_del‘, handler : function() { var selected = sm.getSelections(); if(selected.length==1){ var recordselected = sm.getSelected(); var attachment = recordselected.get ("purchaserecordattachmenturl"); if(null!=attachment||""!=attachment){ var downUrl = "download/download?filename="+attachment+"&inputPath="+attachment; window.location.href=downUrl; }else{ Ext.Msg .show({ title : ‘提示‘, msg : ‘该合同暂无附件,无法下载‘, icon : Ext.MessageBox.INFO, buttons : { yes : ‘确定‘ } }); } }else{ Ext.Msg.show({ title:‘提示‘, msg:‘您需要选择一条合同数据后,才能执行添加操作‘, icon:Ext.MessageBox.INFO, buttons:{yes:‘确定‘} }); } } } ] });
代码分析:
上段代码实现了选中一条合同变更记录,点击下载便可实现该记录已上传附件的下载,火狐点击后可选择保存或浏览
purchaserecordattachmenturl 是加载页面数据时后台向页面参数,代表合同变更记录的一个字段 附件相对路径。
var downUrl = "download/download?filename="+attachment+"&inputPath="+attachment;
downUrl 动态拼接 生成文件流的action方法路径
window.location.href=downUrl;
js直接定位到该流,实现对流的下载或预览操作
接下来,介绍 action的xml配置
<package name="download" extends="struts-default"> <action name="download" class="com.xxx.manage.action.FileDownloadAction"> <!-- 被下载的资源路径 --> <param name="inputPath">${filename}</param> <!-- 下载显示的文件名称 --> <param name="fileName">${filename}</param> <result name="success" type="stream"> <!-- 指定下载文件的文件类型(tomcat里面找到你需要的文件类型) --><!-- <param name="contentType">application/octet-stream;charset=ISO8859-1</param> --> <param name="contentType">image/jpeg</param> <!-- 指定stream方法名称 --> <param name="inputName">targetFile</param> <!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,默认为直接显示文件 --> <param name="contentDisposition">attachment;filename="${filename}"</param> <!-- 指定下载文件的缓冲大小 --> <param name="bufferSize">4096</param> </result> </action> </package>
然后,后台FileDownloadAction 的代码详解
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import com.opensymphony.xwork2.ActionSupport; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; /** * 文件下载 【1】支持中文文件名称 【2】加入session判断,还可进行权限控制 * * @author */ public class FileDownloadAction extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; static Logger log = Logger.getLogger(FileDownloadAction.class); /** * 被下载的资源路径 */ private String inputPath; public void setInputPath(String inputPath) { this.inputPath = inputPath; } /** * 文件名 */ private String fileName; public void setFileName(String fileName) { this.fileName = fileName; } /** * 获取下载显示的文件名称 * * @return */ public String getDownloadFileName() { String downFileName = fileName; try { downFileName = new String(downFileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { log.error("获取下载显示的文件名称",e); } return downFileName; } /** * 配置stream类型结果时,需指定inputName;inputName为方法名去掉get前缀,并且首字母小写的字符串; * 比如此例中的inputName为 targetFile * * @return * @throws FileNotFoundException */ public InputStream getTargetFile() throws FileNotFoundException { System.out.println(inputPath); String realpath = ServletActionContext.getServletContext().getRealPath(inputPath); // InputStream resourceAsStream = ServletActionContext.getServletContext().getResourceAsStream( // realpath); return new BufferedInputStream(new FileInputStream(realpath)); //若为NULL,则说明未取到文件,请确认文件路径是否正确。 // return resourceAsStream; } public String execute() throws Exception { return SUCCESS; } }
以上内容便是文件下载的配置、方法及页面展示 。参照tomcat内不同文件类型选择合适的下载文件格式,当然也可根据文件路径截取后缀,在配置文件中动态设置下载后的文件格式,前提是本类型tomcat确实存在
EXT+struts2实现文件的预览和下载,布布扣,bubuko.com
原文:http://blog.csdn.net/qiyuexuelang/article/details/22644689