EXT+struts2实现文件的预览和下载

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

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值