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确实存在