上一次写了用struts2进行文件上传,这次我来给大家分享一下用struts2下载文件。
很多人可能都知道,struts2中的结果类型中有stream类型,这就是用于支持文件下载的。其实,在页面上直接给出一个超链接,href属性设为要下载的文件路径就可以完成简单的下载功能,但是这么做的话如果文件名是中文的话在默写浏览器上会下载失败。因此,我们需要在action中返回一个InputStream流作为文件下载入口。这里我为大家写了个小例子:
package action;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport {
private String inputPath;//文件路径
//获取文件在服务器上的保存位置
public String getInputPath() {
return ServletActionContext.getServletContext().getRealPath(inputPath);
}
//可从struts.xml中动态配置
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
//返回一个InputStream作为文件下载入口
public InputStream getTargetFile() throws Exception{
File file = new File(getInputPath());
InputStream in = new FileInputStream(file);
return in;
}
public String execute() throws Exception{
return SUCCESS;
}
}
然后是struts.xml文件:
<action name="DownloadAction" class="action.DownloadAction">
<param name="inputPath">/uploadFiles/struts2文件下载.txt</param>
<result type="stream">
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;fileName="download.txt"</param>
</result>
</action>
其中有几个参数需要解释一下:
inputName指被下载文件的入口输入流。
contentDisposition中的fileName可以指定下载文件的文件名,另外还有一点要说明,服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,但是如果加上attachment,浏览器就会提示用户保存。
最后看一下前台页面download.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
</head>
<body>
<a href="DownloadAction.action" >点击下载</a>
</body>
</html>
在页面 中加一个超链接访问这个action。
这次一个简单的文件下载小例子就算是完成了。