一、 导入两个jar包
commons-fileupload-1.3.1.jar
commons-io-2.4.jar
二、编写请求上传jsp
<h1>文件列表--单文件</h1> <div> <span> <img alt="" src="/imgs/${fileFileName }" width="100"> </span> <a href="upload_download/download_file.action?filename=${fileFileName }">download</a> </div>
三、编写action
package com.struts2.fileuplad.action; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletRequest; import com.struts2.util.BaseAware; public class FileDownloadAction extends BaseAware { private static final long serialVersionUID = 9084172624901427828L; private String filename; //该方法会被对应的请求action中result的参数调用 public String getFilename() { return filename ; } public void setFilename(String filename) throws UnsupportedEncodingException { this.filename = filename; } @Override public String execute() { return SUCCESS; } //该方法被对应的请求action中result的参数调用 //即:<param name="contentDisposition">attachment;fileName="${downloadFileName}"</param> public String getDownloadFileName() throws UnsupportedEncodingException{ //使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 // 构造一个新的 String,运用指定的字符集解码指定的字节数组。 //这里本该设置为UTF-8 但是IE依然显示乱码 换成GBK之后基本可以全部兼容了,有问题可以再修改 return this.filename = new String(filename.getBytes("GBK"),"ISO-8859-1"); } private HttpServletRequest request; public void setServletRequest(HttpServletRequest request) { this.request = request; } //该方法被对应的请求action中result的参数调用 //即:<param name="inputName">inputStream</param> public InputStream getInputStream() throws FileNotFoundException, UnsupportedEncodingException { String fileapath = request.getServletContext().getInitParameter("struts2_upload_imgs_path") ; File file = new File(fileapath + File.separator + filename); FileInputStream fis = new FileInputStream(file); return fis; } }
四 、 配置struts.xml
<!-- 其中主要使用的参数是: contentType 指定下载文件的文件类型 —— application/octet-stream 表示无限制 inputName 流对象名 —— 比如这里写inputStream,它就会自动去找Action中的getInputStream方法。 contentDisposition 使用经过转码的文件名作为下载文件名 —— 默认格式是attachment;filename="${fileName}",将调用该Action中的getFileName方法。 该项目中调用的是getDownloadFileName()方法 bufferSize 下载文件的缓冲大小 --> <action name="download_file" class="com.struts2.fileuplad.action.FileDownloadAction"> <result type="stream"> <param name="contentType">application/octet-stream</param> <param name="contentDisposition">attachment;fileName="${downloadFileName}"</param> <param name="inputName">inputStream</param> <param name="bufferSize">1024</param> </result> </action>