structs2中文图片下载

struts2文件下载的原理是 页面请求,经过一struts的动态代理,拦截器等,在Action中获得文件的流,在经由struts.xml中的result配置,获得流将流传递给 tomcat,从而使用户获得下载的文件(说错的,或者说的不完整的,请大神指正,目前小弟就理解到这个水平了);
首先是Action代码

文件是 ImageDownloadAction

package cn.itcast.action.f_download;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class ImageDownloadAction extends ActionSupport {
	
	//1 下载的资源
	private InputStream targetName;
	//2下载的文件名称
	private String fileName;
	
	

	@Override
	public String execute() throws Exception {
		
		//this.fileName = "美女.jpg";
		
		//准备下载的资源流
		//ServletActionContext.getServletContext().getRealPath("/e_download/1.jpg"); //获得文件路径
		this.targetName = ServletActionContext.getServletContext().getResourceAsStream("/f_download/" + fileName); //文件对应的流
		
		
		return SUCCESS;
	}
	
	public InputStream getTargetName(){
		return this.targetName;
	}
	/**
	 * <result type="stream" 获得文件名称  
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public String getFileName() throws UnsupportedEncodingException {
		// * 注意:<s:debug /> 会出现空指针,需要非空验证
		if(fileName != null){
			return new String(fileName.getBytes("GBK"),"ISO-8859-1");
		}
		return null;
	}
	/**
	 * 获得get请求 资源名称
	 * @param fileName
	 * @throws UnsupportedEncodingException
	 */
	public void setFileName(String fileName) throws UnsupportedEncodingException {
		fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");  //如果文件名称是从链接中传递过来的,这样赋值,避免中文乱码
		this.fileName = fileName;
	}

}

接下来配置structs.xml 文件

<!-- f_download 中文文件下载 -->
		<action name="imageDownloadAction2" class="cn.itcast.action.f_download.ImageDownloadAction">
			<result name="success" type="stream">
				<!-- e1 配置 获得流 action属性名称,action必须提供getter -->
				<!-- 这两个配置可以参照struts源代码 -->
				<param name="inputName">targetName</param>
				<!-- e2确定资源流必须下载 -->
				<!--${fileName}是从imageDownloadAction2中的getFileName中获得的 -->
				<param name="contentDisposition">attachment;filename=${fileName}</param>  //否则直接显示在浏览器上
			</result>
		</action>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值