Struts2 中使用 type="stream" 的 result 进行下载即可。只用提供一个输入流inputStream,剩下的输出工作struts帮我们做。

例子一:

1.可以为 stream 的 result 设定如下参数

contentType: 结果类型
contentLength: 下载的文件的长度
contentDisposition: 设定 Content-Dispositoin 响应头. 该响应头指定响应是一个文件下载类型, 一般取值为  attachment;filename="document.pdf".
inputName: 指定文件输入流的 getter 定义的那个属性的名字. 默认为 inputStream

这四个一般在getter方法中定义或者在execute方法执行时设置,而且不用声明变量,直接getter方法,第一个字母大写,例如public InputStream getInputStream()。

bufferSize: 缓存的大小. 默认为 1024
allowCaching: 是否允许使用缓存
contentCharSet: 指定下载的字符集

这三个参数一般使用默认值或者在xml文件中配置。

以上参数可以在 Action 中以 getter 方法的方式提供,也可以通过配置配置,也可以使用默认值。也可以动态设置值,在execute方法中设置。

  1. package FileDownload;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.InputStream;
  5.  
  6. import javax.servlet.ServletContext;
  7.  
  8. import org.apache.struts2.ServletActionContext;
  9.  
  10. import com.opensymphony.xwork2.ActionSupport;
  11.  
  12. public class FileDownLoad extends ActionSupport {
  13.  
  14. /**
  15. *
  16. */
  17. private static final long serialVersionUID = 1L;
  18.  
  19. private String contentType;
  20. private long contentLength;
  21. private String contentDisposition;
  22. private InputStream inputStream;
  23.  
  24. public String getContentType() {
  25. return contentType;
  26. }
  27.  
  28. public long getContentLength() {
  29. return contentLength;
  30. }
  31.  
  32. // 在getter方法中设置所需要的参数
  33. public String getContentDisposition() {
  34. contentDisposition = "attachment;filename=filesUp.html";
  35. return contentDisposition;
  36. }
  37.  
  38. public InputStream getInputStream() {
  39. return inputStream;
  40. }
  41.  
  42. @Override
  43. public String execute() throws Exception {
  44.  
  45. //确定各个成员变量的值
  46. contentType = "text/html";
  47.  
  48. ServletContext servletContext =
  49. ServletActionContext.getServletContext();
  50. String fileName = servletContext.getRealPath("/files/filesUp.html");
  51. // 打开输入流
  52. inputStream = new FileInputStream(fileName);
  53. contentLength = inputStream.available();
  54.  
  55. return super.execute();
  56. }
  57. }

上面可以在execute方法执行时动态设置参数,也可以在getter方法中设置参数。

配置文件

  1. <!-- 文件下载 -->
  2. <action name="fileDownload" class="FileDownload.FileDownLoad">
  3. <result type="stream">
  4. <!-- 其他的参数在类中设置或者使用默认 -->
  5. <param name="bufferSize">2048</param>
  6. </result>
  7. </action>

例子二:

目录结构:

动态将数据写到Excel文件并提供下载:

  1. package cn.xm.exam.action.exam.exam;
  2.  
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.URLEncoder;
  9. import java.sql.SQLException;
  10. import java.util.List;
  11. import java.util.Map;
  12.  
  13. import javax.annotation.Resource;
  14.  
  15. import org.apache.commons.io.FileUtils;
  16. import org.apache.poi.hssf.usermodel.HSSFCell;
  17. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  18. import org.apache.poi.hssf.usermodel.HSSFFont;
  19. import org.apache.poi.hssf.usermodel.HSSFRow;
  20. import org.apache.poi.hssf.usermodel.HSSFSheet;
  21. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  22. import org.apache.struts2.ServletActionContext;
  23. import org.springframework.context.annotation.Scope;
  24. import org.springframework.stereotype.Controller;
  25.  
  26. import com.opensymphony.xwork2.ActionSupport;
  27.  
  28. import cn.xm.exam.MyElFunction.MyElFunction;
  29. import cn.xm.exam.service.exam.exam.ExamService;
  30. import cn.xm.exam.service.grade.EmployeeExamService;
  31. import jxl.common.Logger;
  32.  
  33. /**
  34. * 导出参考人信息 1.查出数据 2.写入Excel 3.打开流,提供下载
  35. *
  36. * @author QiaoLiQiang
  37. * @time 2017年10月29日下午10:29:51
  38. */
  39. @Controller
  40. @Scope("prototype")
  41. @SuppressWarnings("all")
  42. public class ExtExamEmployeesAction extends ActionSupport {
  43. private Logger logger = Logger.getLogger(FindExamAction.class);
  44. private String fileName;// 导出的Excel名称
  45. @Resource
  46. private ExamService examService;// 考试service
  47. @Resource
  48. private EmployeeExamService employeeExamService;// 员工成绩service
  49.  
  50. // 1.查数据
  51. private String examId;// 考试ID(用于查询考试员工)
  52.  
  53. public List<Map<String, Object>> findExamEmployeeByExamId() {
  54. List<Map<String, Object>> employees = null;
  55. try {
  56. employees = employeeExamService.getEmployeeexamsByExamId(examId);
  57. } catch (SQLException e) {
  58. logger.error("导出考试人员异常", e);
  59. }
  60. return employees;
  61. }
  62.  
  63. // 2.写入Excel
  64. public boolean writeExamEmployees2Excel(List<Map<String, Object>> examEmployees, String fileName) {
  65. // 标题
  66. String[] title = { "序号", "姓名", "身份证号", "性别", "所属部门", "员工类型", "考试方式" };
  67. // 创建一个工作簿
  68. HSSFWorkbook workbook = new HSSFWorkbook();
  69. // 创建一个工作表sheet
  70. HSSFSheet sheet = workbook.createSheet();
  71. // 设置列宽
  72. setColumnWidth(sheet, 7);
  73. // 创建第一行
  74. HSSFRow row = sheet.createRow(0);
  75. // 创建一个单元格
  76. HSSFCell cell = null;
  77. // 创建表头
  78. for (int i = 0; i < title.length; i++) {
  79. cell = row.createCell(i);
  80. // 设置样式
  81. HSSFCellStyle cellStyle = workbook.createCellStyle();
  82. cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置字体居中
  83. // 设置字体
  84. HSSFFont font = workbook.createFont();
  85. font.setFontName("宋体");
  86. font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 字体加粗
  87. // font.setFontHeight((short)12);
  88. font.setFontHeightInPoints((short) 13);
  89. cellStyle.setFont(font);
  90. cell.setCellStyle(cellStyle);
  91. cell.setCellValue(title[i]);
  92. }
  93.  
  94. // 写入数据
  95. // 从第二行开始追加数据
  96. for (int i = 1; i < (examEmployees.size() + 1); i++) {
  97. // 创建第i行
  98. HSSFRow nextRow = sheet.createRow(i);
  99. // 获取数据
  100. Map<String, Object> employees = examEmployees.get(i - 1);
  101. for (int j = 0; j < 7; j++) {
  102. HSSFCell cell2 = nextRow.createCell(j);
  103. if (j == 0) {
  104. cell2.setCellValue(j + 1);
  105. }
  106. if (j == 1) {
  107. cell2.setCellValue(employees.get("employeeName").toString());
  108. }
  109. if (j == 2) {
  110. cell2.setCellValue(employees.get("employeeId").toString());
  111. }
  112. if (j == 3) {
  113. cell2.setCellValue(MyElFunction.replace(employees.get("sex").toString(), "12", "男女"));
  114. }
  115. if (j == 4) {
  116. cell2.setCellValue(employees.get("departmentName").toString());
  117. }
  118. if (j == 5) {
  119. cell2.setCellValue(
  120. MyElFunction.replace(employees.get("employeeType").toString(), "01", "内外") + "部员工");
  121. }
  122. if (j == 6) {
  123. cell2.setCellValue(employees.get("examMethod").toString());
  124. }
  125. }
  126. }
  127.  
  128. // 创建一个文件
  129. File file = new File(fileName);
  130. // 如果存在就删除
  131. if (file.exists()) {
  132. file.delete();
  133. }
  134. try {
  135. file.createNewFile();
  136. // 打开文件流
  137. FileOutputStream outputStream = FileUtils.openOutputStream(file);
  138. workbook.write(outputStream);
  139. outputStream.close();
  140. } catch (IOException e) {
  141. e.printStackTrace();
  142. }
  143. return true;
  144. }
  145.  
  146. // 设置列宽()
  147. private static void setColumnWidth(HSSFSheet sheet, int colNum) {
  148. for (int i = 0; i < colNum; i++) {
  149. int v = 0;
  150. v = Math.round(Float.parseFloat("15.0") * 37F);
  151. v = Math.round(Float.parseFloat("20.0") * 267.5F);
  152. sheet.setColumnWidth(i, v);
  153. }
  154. }
  155.  
  156. // 3.打开文件的流提供下载
  157. public InputStream getInputStream() throws Exception {
  158. this.create();// 创建文件到指定目录下
  159. String path = ServletActionContext.getServletContext().getRealPath("/files/examEmployeesExcel");
  160. String filepath = path + "\\" + fileName + ".xls";
  161. File file = new File(filepath);
  162. // 只用返回一个输入流
  163. return FileUtils.openInputStream(file);// 打开文件
  164. }
  165.  
  166. // 产生Excel到文件夹下面
  167. public void create() {
  168. // 获取工程下的路径
  169. String path = ServletActionContext.getServletContext().getRealPath("/files/examEmployeesExcel");
  170. String filepath = path + "\\" + fileName + ".xls";
  171. // 获取文件
  172. List<Map<String, Object>> examEmployees = this.findExamEmployeeByExamId();
  173. this.writeExamEmployees2Excel(examEmployees, filepath);
  174. }
  175.  
  176. // 文件下载名
  177. public String getDownloadFileName() {
  178. String downloadFileName = "";
  179. String filename = fileName + ".xls";
  180. try {
  181. downloadFileName = URLEncoder.encode(filename, "UTF-8");
  182. } catch (UnsupportedEncodingException e) {
  183. e.printStackTrace();
  184. }
  185. return downloadFileName;
  186. }
  187.  
  188. @Override
  189. public String execute() throws Exception {
  190. // 先将名字设为秒数产生唯一的名字
  191. this.setFileName(String.valueOf(System.currentTimeMillis()));
  192. return super.execute();
  193. }
  194.  
  195. // get,set方法
  196. public String getFileName() {
  197. return fileName;
  198. }
  199.  
  200. public void setFileName(String fileName) {
  201. this.fileName = fileName;
  202. }
  203.  
  204. public String getExamId() {
  205. return examId;
  206. }
  207.  
  208. public void setExamId(String examId) {
  209. this.examId = examId;
  210. }
  211.  
  212. }

配置文件:

  1. <!-- 导出参考人员信息 -->
  2. <action name="exportExamEmployees" class="extExamEmployeesAction">
  3. <result type="stream">
  4. <!-- 其他的参数在类中设置或者使用默认 -->
  5. <param name="contentType">application/octet-stream</param>
  6. <param name="inputName">inputStream</param>
  7. <param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
  8. <param name="bufferSize">8192</param>
  9. </result>
  10. </action>

${downloadFileName}会调用getDownloadFileName()方法

例子三:

目录结构:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWsAAADQCAIAAABOXtctAAAaSElEQVR4nO2d/ZMURZ6H+3+4u/UuLta7uB+4i2PvNox1tbf3RRzxnRd1XReERaHPios94u7WVdaRO192EUdalkJAVE55U5ZXbV9oL/RwQgFfBhhfaEalYEaEYGaYnhmGmZ5pGJi8H+otMyuzqjq7a7p7+vNEhU53VWVlVmU+lZld9SVGSubQa8s3L5y8/YErdiy6cudDV+1qjL/aGH+1Mb6rMb57yY2fbFmc7+9UTz2jxRK6UXouAQAREKt0BoKAQQCoYqreIACAKgYGAQCoA4MAANSBQQAA6sAgAAB1YBAAgDowCABAndo1iKEnYlqm0rkAoL4pj0GGe0+2rJm3b9mMfctmtKyZN9x7MuSOGS1Ga8DQE/TzY9xHFn+DZLSYDTQDQGSUxyDvL5s5kjMujfRcGukZ+PbQR6vnhd2TeeTU0BOxGPXZ93lUuUEyGuONjFb8Q61qHRx0i0DdEcogzc3NTU1NsrXDuY69T1x9ev/i/i+WDn6x5OzBR0//34Ofr/vFgVXTDqya9tn6e84P5aRJM92MjBbTNM1phIae8Gn7subKdWvUgEEACEWwQfbs2TN58uRJkybJNvhw+Q1dn607e3z7uY6d5zp2nmvfcdbY3m9sG+hID3Skc22bW9bcIU+eanUZLaZl3M9Me3RHJbZUzNXu924iUu1QQxsm5YSua1Ti1GZWUt6jh9kLgIlPgEFMfcyaNcvHIO8+8oNCd8ZnefeRH/gcwhFFxux9OD2PjCaygrO5OeSxReD0PKQGyWjcAMnalxrzuB0i2l7CowfuBUBd4GcQRx+zZ8/2MUjXkfcGjXf6Dm0433vswtk24+3ftPzPbXtXNuxd2bBXb9irN7zX9KN9z9y875mb9z1zi2B/SxmOOaw/3IZLdx3cezzXXO2PMoPw39MuoAXhcYH46EF7AVAfSA1C68PfIBeGek5snZPv2PrtjnsuDPd3f7q60Pl6ofONQucbha43C11vFbp2F7ozfV9t2vPUFFEC9uiFGiHwnwVSkBhEphCBQZyuTpBBBOnBIAAQ4mOQpqamSRRLly6Vbdnz8fPH3rp/8d3/3P76wv5s+kLvR4UTmwonNhe+fbnw7SuFb7cUTv6p94vV7yy7PtfRKkzBnEFlhhj8Z3rewh080JOuzgdDTzBTEdZvMZ5RjNvD8XeB8OgwCACElP5r7mi+7+hLM098+Pht/xAbbEsZm+68mD9dMFYXjq0pHHu2cGxt4fhzuYNPZp5o6Gk/JE2F+/3V89ma9GCmQA09EdM0fiKVTsCzRj6TyrvAPqBrBm63EHsBUAeUapDTH+gn37w33/bIa6mbCl891rFzTu7THYW2pYW2JwttTYUvnzqz/+G3lkw9c1yuDwBAzVKqQb7ccNe5gw8Nty1Z9e8/HD3WNNCy6OiW+eWMkwoAqGJKNUjrymvOfrzoUseKUx8uvtSx4sx7C9s2zi5LzgAA1U+pBunJ7v5k2Q8/Wvp9czmoT+k72lyOjAEAaoDafTcXAFB5YBAAgDowCABAHRgEAKAODAIAUAcGAQCoU7sGwUsoAFSeChtEOcAqDAJANRCJQfbv3z80NBRmS/UAqzAIAFVAJAbZsmXL1q1bczl5eFRCSIkBVmEQAKqAqAxy5syZdevWnTp1ymezcgRY9cRJFb6LDwCIhqgMQgjJ5XK6rh89elS2WWkBViVxUtE1AWAcidAghJDOzs7HH3+8r69PuNnbi68onNphLvmOV4oMsOoT5RBBfgAYJyI0SG9vr38f5I3ffb/wzYbCNxv6Pl+x/9mbu1tXFhNgVWYQ9yM8AkDURGWQnp6ewHmQV3/7T4Vja3oPPtG8vKH3sxWFE5uKCbAqiZNq6DodBhHjGQCipJK/xWz7z+/lPlr8btM1uZbfF4xVBWNVMQFWpXFSBZOrAIBoqOTzIK8s/Mfdj17ds//BwpE/FI4sKRx5AgFWAagtKvlM6qHXlm9eOHn7A1fsWHTlzoeu2tUYR4BVAGqL2n0vBgBQeWAQAIA6MAgAQB0YBACgDgwCAFAHBgEAqAODAADUgUEAAOrAIOHJaHhOHgCW2o2TOv7AIADw1G6c1BJReHMXBgGAp3bjpJYIDAJAGajdOKmEfo/fDiXkfkO925/RYgld16gtqc0SukGHXLUSkqVj/Y1QrACY1G6c1IzGxyBjv3Eip5o6MP809IS1Cd0HYUOu+qWDUKwAMNRsnNSMxscw5L+hI6c6Kww9ITYIE6FImg6lJIRQBKCG46SGMoj5uXSDOOnQXQ+EYgWghuOkuqMLQjK6PbvBjD7cSY1iDOKXDkKxAsBQu3FS6flMZgpDPJPKG8Te251JpZMOmElFKFYATBAnFQCgDuKkAgDUwXsxAAB1YBAAgDowCABAHRgEAKAODAIAUAcGAQCoA4MAANSBQQAA6sAgAAB1ECcVAKBO3cZJBQCUgbqNkwoAKAMTKk6qN3wpApoCECkTKE6qN8oHAgABEDETKE6qIHwpApoCEC0TKE6qhTd8KQKaAhAVEyhOqjd8KQKaAhAxEypOqjd8KQKaAhApiJMKAFAHcVIBAOrgvRgAgDowCABAHRgEAKAODAIAUAcGAQCoA4MAANSBQQAA6sAgAAB1YBCTjIbn3gEoHsRJNYFBAFChwgapmjipMAgAKlTSINUUJxUGAUCFShokmjip1Jv+npf+7ShDwm9gEACKppIGKTlOqhN2zA0gZH3rrvSEUxXvCIMAoEIlDVJqnFQWtn9BfeLCG4p3hEEAUKGSBokmTmoIgwh2hEEAUKGSBilfnFSS0dw5j4RuGHqCHsUw4VTFO8IgAKhQSYOUL06qOwlii4OaVPWEUxX9O1QwCAAqVNIgiJMKQK2DOKkAAHXwXgwAQB0YBACgDgwCAFCnNIPEYnW0AAA8wCAwCADqlMMgE546KSYAxQODhKBOiglA8cAgIaiTYgJQPDVtEOvpdE13XoOJ5uF0GAQACRU2SClxUt2gIAYMAkBlqLBBSomTKnpNHwYBYFyJ1iDNzc1NTU2ytSXGSYVBAKg4ERpkz549kydPnjRpkmyDUuKkUpHGtAwT5JAK/cGHLxO91l9yMQGoZ6IyiKmPWbNm+RiktDipVB9EYBBRMFR3s7IVE4A6JxKDOPqYPXu2j0FKipPqbxBpMNQYH3e5hGICAMpvEFof/gYpKU5qoEGkojCHMsV4BAYBQEL5DdLU1DSJYunSpbK9S4uTGjiK8QRDNXSdCnNYxHgGBgFAQiV/zS0xTqqvQcSzpu7gpqj5EBgEAAmVNEjNxEmFQQCQgLf78XY/AOrAIDAIAOqgYQAA1IFBAADqwCAAAHVgEACAOlVpkIpPmk7gBYCyUpVVquLNbAIvAJSVqqxSqOtRgLMKIqAqq9R41nW/d/CUUyw5ypFPrpRDOsIgIAKqskqFqOulBFhlqHaDUK/3mG8UwyCgmqjKKhWirpcSYJWhFgwiSQ4GAZWnKqtULEZisegCrDLAIACUQFVWqViMxGIRBVglhPAhzFyD0N9bjZMyDBVzxPo2o8USuq6xyYhjtTIBBcTxWoW58hhEOSgsDAIioOqq1J49ewINUlqAVS74kNPmqD+pregGm0gknBkIN2yi9N+sESdIiKFr9rful7JcMfMgCd1QDwoLg4AIqK4qZUZIDDRISQFWuWGL85EfzvBNMaMldCOjWY3Yuw/9pTDSItOm+Q6CLFdh+iAhg8LCICACqqhKOQFWAw1SUoDVIgxifjb/oNyRsdcUbZCEbljy4P1QokHCBIWFQUAEVFGVcgKsmnU9sgCr9HiBbs2eQYf9wdATiYTVbM2/qSkPuUFkCbIpi0YxQsfYKAeFhUFABFRllQqq6yUGWGWmHXWNm6uQTXxan935DhJkEFmC7ggmoWmuH8S5CjeTGiYoLAwCIqAqq1RQXa+ZAKtVBQwCIqAqq1RQXT/02vLNCydvf+CKHYuu3PnQVbsa4682xl9tjO9qjO9ecuMnWxbn+zvHLbM1AwwCIqAqq1TFX2CdwAsAZaUqq1TFm9kEXgAoK6hSAAB1YBAAgDp1YZB2AICHsjSuejHICACAAgYpgvb29spPYWLBUtOLBBgECxYsIRYJ9WUQs/927uu2k4sWtt95U/vPb2y//frjt009PvO64zOu/ebuab1vv1m+fmI2FY+nsgEbpZOxWCyZDt47m4rH2OTSSedzNhVn03DXpZNs+tlUnP6cTcXdB++TyWSMJ6AI6SS9STrJpS0qWSBMnnjsFNPerEqzLL0S1Clkt04m6bPkbOY5KFM+e7NQF54rqaBY8VTW+7l40klqT+uAyXQxoxgYhDZIb9vhI3NnGHfeaBnkjhscgxyfPuXYtGt7dv2pqAuUTcXjqbS4zjAXT7xvLJ7KCjezq6GwOVn1zWmwdlt16q5dmT1VPh5nknOqvJmOnaAnPWmj5uTElsNjPTN91jOSU0rVeXdj6oOw8bMrRJlOplmJCs69dRAqF7RB5IYMEojAed7tnCNYqVGHLt0gdMFhkCJwDJIfHn5sqXZg+jVtt0097umDHJ825dit1xjTpwx+eSTs5TFri3N1fe+ebIXJpuJU+2N7CnRdS6b5BkVXYuvIEoNYqdp1yD4k3y1hDBJUydlOB7cmmRYn4iZkZ8yvOZTLIIIE00lPkbKpZCol69Ak025pTNd7hcQdQ1j80N2iSA1C6xIGKQLHIJn2liufX7B1xk8/nz7lqztuOLFp3d6Wk/97oOf4p+92vDzz9MZ439arh177Uf6Dfwt9deKpLFWtffvt7MjCcxvOpuIxtr/p/SCrRrI+iE9Xn24AwX0QcbZpC7p3bicJcU+DP2fC0gRmOXAUEyBzwQVgc+j7hTjPybR7KwjaBQapJRyDNH644e9e+ZdfPnzH+zf/uH3juke2D81cnp+xPD9ndf7Lr4+ONjdcbP7Zxfd/evHD60aG88HXJpuKJ9Oye6S3r071C1KS6p1MOf1+q4rJbujJZNxpLH4G8al25k7MQFtwL/btXYm6TdwIQDi28XdI2fsgkp6TOykQkEI6GU8m4+4sEX3aqI4H3V0U5MJX5/FUNoT02DKY1mLPvPBY/N0kmYZBisIxyOx3Un/7cvLv18//411Tmg92mfqY9nR+Wiq/ND1UOLxo7JOGsZYGcqBhJH9WVDu5+pdMSyty0FifSkXarQi66bibSOdBRmQVVzqK8emDUGUzPZH1TCBIez6C40kdIJUy9SH8LK2kXTLp0NvEUyk2Y87Ix9Gym/lsKmk2/WSKnxSRlp45VzzF9EHMXNOdMncsyoyP0QcpEccgM3f/4fLNC/7m5QXTn5r7xoHB6U9b+rg1lV+0Zej80SWk9XrSOpW0Xjcy1BtQMdNJc1ws+10jxD3Eryb5TWJSE2PcDJ/YIKK7odgg0i+c/Zj2wNzZuUStj9b/BL8scRM87NHlZ7AYg5j5TaZ9dC4agtJpZ1PxZJofE/J9kHTK06dSH8WwxggyCFf9rFNOb4pRTOk4Brn33T9+d/P8726ef/nmBR9//uXtKyx93LJsaPu+gYuH55PWqaR16tihhpHhcz6Xn6pwopoiGb8wGwQaxm5GyRRX15jfGuKpdCrpTuWG74MwMqO6HLImG9gFZ2YcR6gWIGq8ln6l4xB2hlL0IZ0MEAhlN+8PUnzR0ymrJ2Enzl8vzzjMc/QAg4S9u3DG8B0WwSDjhWOQlZ+m/3rTveZy05uP7jncc//mofvWDW5sHvj0s5ecDsjoZ3N8KydX+zx1JWUPmJ15D3llF96LmClLfgv+10r659GQfRD+W6t6SyYfgjNNDWeoamz/MMOMi5xjyw/BrhEbRHleUZR80uknuR0cpvnaGRa3fG/HZUQ4EcHnQnxZYozF6Nl3akaK6p1S1UQ0imHm52EQRRyDdPSdvnzTPX+1cZ65fG/rwgc/ePHxfS/ft+3B0UM3m/ogrQ0XTm4JWRvtqiUb0rKVTETwdId8FOMdIRRvEPFsouQmSz0/4nQ76BnTGPU7iNMQWJOI5p/5nPG/ensNUoJAuH3d9uie6GTaLIDQV1nzeTNbO+J8qo5i+MsmuoysQaiHAIUTqfFUCn2QkqGfKHuyZdtfbpx32YZf2cvcy56/+/B701x9fJEcGR4MqoZsRaBH0Py9ifqamrYP6sz61DWuboaoiuGOI+1ox1NpRx70VAC1VzyVorpBfCea3iPLPkDjRTxH4+TNncssBsl1cU6U16N2/85ZYycRd8c7VtGc5hzKIMKfTpx1tm3N9eZnew+h04s8ES4wSBHQBhkeGb7/gxcuWz/3OxvmfmfD3L9YP2fB+hljrTea+hj9YkFh8FRRV8JxiPpdsX6w/aFe8YELDDJecO/FjIyM7Px679XbfvPn6+/+s+fuOv3RTNLacOHQLYWOtSP5vvJcXAAiBwYZL7wGMek+13v4ZNtg71cjg6dDPUIGwEQBBikCmUEAqFtgkCJwDBJx1DgAaomw7QcGIQT/3hIAqsAghMAgAKgCgxACgwCgCgxCiHUWVjyzNvxS6RwDUB3AIIRYZ+Hw19/Iln9tXEn/txiDZLRYQjcizPv4EVCUjBbTMuOYHVAVwCCEWGeh5eChkIvcIBnNeTzaak0VMYibjXK26coZhDqtbJH8CuqsE2Xa3ZFaa+gJ75fCLal1gtS96TAFkOUpoDxVCgxCiPQsjI2NjY2NXbp0aXR09Pz588PDw0NDQwMDA2KDZDTmwme0hG5UwiAZzc2GoSfMPw09UXKlrKhBBEn75cfQE/ZK+nw4ezo7umup7dyUhVtSxxC4gDrVgkP7XArhhZOWrloUA4MQ4p6Fn/x6w8/+46VrH1w39b+eu2nJGq9BfvLrDRKDCCsLqYBBDD0huS1OLIOIy+mudPfwL7tdKqZ0wsTZ8ht6IqZpglNCZ1ZwyqRn0bdAnk1hkKrCPgvX3P9iQ+MLNzz27C1PrZqur7h06RI9eMnn89c/sra/v19gEGm9yGixhK5rbN/UrAEZzb2F0d1ctv5lrC6xlnG38u1ke11GJW5u5HaznS2ZfArTZ1aIU6BzLimO7yEkLYg6GH2Tps6roJlSp8BPfc7Z4g3iaaLMebU2EKZM92D41X5t3+cmRBeTvZp0gu7fVAWTjon4027oCboTRv/pd3VgEELcs2B2PW59euXM1ct//sJTFy9evHDhQqFQKBQK+Xx+cHDw9rWpvr6+Ig0Soy4r3YKZ9ubuzfarrRXmdeRHJPRRuc4zV23YiqaJ+/CefDJ1msqlLAU3KWlxBIcQFUGCmzQ9ZqSGLMKE/G77TCLMCfSOWJhT4dUOm01hyw3uxvF7Cc8PVT65QRi3e8dxotNufStWoOTqwCCEuGfB7Hrcvjb1ixefnL3p96Ojo3QfZGBgYN62xblcrug+iHsNXIPQMyaS+k+vEP3tOz9n3bgFFY1a624hyieXMW8vnk9B2KqExaEOIS+CCOGgw3PMEH0QQ0/wR6PmXnV3/sOzJZWcIGVGZ75nUAJz4cTnJ5RBqBPgafzS026uKGYCGAYhxD0LZtfjlxuWzHnl0Xu2P+zMnpoTqP39/blc7syZM5J5EGHlUDOI9/4sMUhAhXTuPlydczsTku6Mr0GkKcgMIuxuqE0020dhZw0EBvEdksgGDPxRpPOn0obl1/0porD2YcW7lMMgPl1mP0F6gEEIcc+C2fX41db/nr/rd/e9/tuRkRG6D9Lb29vT09PV1SX8LcZ7p/I0EYlBvN1+QR9S+Dc3yrCblkBO7BjHTonqmwvzSadPlU+agmQUI+4Sy4vgObWGd0hE3+udP9lxIl9eZrMAf3j8GGZLLg/e0vm2R/GFE54fziBUFuhRDHPlnPuI32k3jyr7HUt8dWAQQpizMDY25kx/5PN5c/rj7NmzfX19PT093d3dnZ2d0udB6F6ft71KDSLeM4RBhDOawolH+8uEbtCPK2iaXx+EyVdC15nmIkohxEyq9xCiIkhPK9/TYHekW6+bLN2SxEMnp3nxBxFvyeSANwi7F3ef8J/lEV44v0vsKIu/FvYPRbIzIEqWmediXeR3dWAQQvwMMjg4ODAw0NfXl8vluru7u7q6Tp8+jafaQXUzjj/3wiCE4L2YqoK/749TSxhvIi0mDDLO4N1cMKGAQcYZGAQANWAQQmAQAFSBQQiBQQBQBQYhBAYBQBUYhBAYBABVYBBCYBAAVIFBCMHzIACoAoMQEk2cVM8r52F2mLgPUIEJCgxCSFnipLKvbLLvJ4WhLM8AMc85+r0eLtzJN9KFrCyed1MEeWC35l6b90scVD8wCCFliZNaqgGKfs1dkohfHgR5lL2HaacnfsvUL9M+eTCYwKJUiqUWfhwfwQQcMAghZYmTWgMGkYTDYV74lO/u3dsQBvaU5sF+X1Twrr8kqdDAIJUDBiGkHHFSvZWYD/eSEUZFdaM1SMcekih8ghYjfjtclkEroaBYXu46bndDGKlUlgeDDywaFATIUyRB6AD+Xf1EFcQNrTdgEELKESeVnQexo3DQIRZkYTK88Tk8EXq4zn6I7gqbBH9UJtNhDMIErKGPIQrMIcqDUwg2oAbTKiVKlEbkoFaHitk1TnFD6w0YhJByxEkN7oPY30umNiU3Z253Ngid3yQol4pEDiH6IHzsNcnWkikRPk4bH/XPzr4dl5QrEVde2dkrR9Q/0UXhMxA8LV1/wCCElCVOajEG8W+PAoNwyghTb8ONT4KGEn5xtfwjlbp5CAgsKsit4EjUkEVQkGqKG1pvwCCElCVOamiD+IaodDYQxRn1hrHk8yCKJ8ql4eRNNZ4ou68nxp80D+KcyL80k9V5GQjPXjXFDa03YBBCyhInNbxBpNODks46NVcgmEKg8Ysn6smAajxRRmDeuUlZHrzFDPU0iGDys8rjhtYbMAghiJM64cGsZ2TAIITgvZgJDwwSGTAIIXg3d8IDg0QGDEIIDAKAKjAIITAIAKrAIITAIACoAoMQAoMAoAoMQoh9FrBgwaK2yBrWeLbiSlLxC4AFS00vEv4f4t29YDiJUqwAAAAASUVORK5CYII=" alt="" />

1.前台JS

  1. <script type="text/javascript">
  2. function down(flag) {
  3. if (flag == 1) {
  4. if (confirm("确定下载谷歌浏览器?")) {
  5. window.location.href = "export_execute.action?name=ChromeStandalone_56.0.2924.87_Setup.exe"
  6. }
  7. }
  8. if (flag == 2) {
  9. if (confirm("确定下载火狐浏览器?")) {
  10. window.location.href = "export_execute.action?name=Firefox-57.0.2.6549-setup.exe"
  11. }
  12. }
  13. if (flag == 3) {
  14. if (confirm("确定下载操作手册?")) {
  15. window.location.href = "export_execute.action?name=《安全培训管理系统》用户考试操作手册.pdf"
  16. }
  17. }
  18. }
  19. </script>

2.后台Action(tomcat编码是UTF-8)

  1. package cn.xm.exam.action.exam.exam;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6.  
  7. import org.apache.struts2.ServletActionContext;
  8. import org.springframework.context.annotation.Scope;
  9. import org.springframework.stereotype.Controller;
  10.  
  11. import com.opensymphony.xwork2.ActionSupport;
  12.  
  13. /**
  14. * 下载专区的下载文件
  15. *
  16. * @author QiaoLiQiang
  17. * @time 2017年12月14日上午10:06:41
  18. */
  19. @Controller // 控制层
  20. @Scope("prototype") // 单例模式
  21. @SuppressWarnings("all") // 压制警告
  22. public class ExtDownloadFile extends ActionSupport {
  23. // 注入服务器目录地址
  24. private String serverPath;// 注入要下载的文件的地址
  25. // 接收文件名
  26. private String name;// struts的属性驱动
  27.  
  28. public void setServerPath(String serverPath) {
  29. this.serverPath = serverPath;
  30. }
  31.  
  32. public String getServerPath() {
  33. return serverPath;
  34. }
  35.  
  36. public String getName() {
  37. return name;
  38. }
  39.  
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43.  
  44. // 需要提供给struts写出数据的输入流
  45. public InputStream getInputStream() {
  46. try {
  47. // 转码:解决中文乱码问题
  48. // 先用ISO8859-1编码 再使用UTF-8解码
  49. // String filename = new
  50. // String(name.getBytes("ISO8859-1"),"UTF-8");//中名名称.后缀名
  51. String filename = name;
  52. String path = ServletActionContext.getServletContext().getRealPath(serverPath);
  53. FileInputStream fis = new FileInputStream(new File(path + "\\" + filename));// 服务器目录地址+文件名
  54. name = new String(name.getBytes("UTF-8"), "ISO8859-1");
  55. return fis;
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. throw new RuntimeException();
  59. }
  60.  
  61. }
  62.  
  63. // 下载方法
  64. public String execute() {
  65. return SUCCESS;
  66. }
  67. }

3.配置:

  1. <!-- 下载专区的文件下载 -->
  2. <action name="export_*" class="extDownloadFile">
  3. <!-- 为setServerPath方法中的serverPath属性注入值 也就是文件存放的地址/目录(文件应该从哪里下载) -->
  4. <param name="serverPath">/files/downloadFiles</param>
  5. <!-- 文件下载的关键:视图类型一定是stream -->
  6. <result type="stream">
  7. <!-- 往StreamResult类中的属性注入内容 -->
  8. <!-- 返回给浏览器的文件类型。返回通用的二进制 -->
  9. <param name="contentType">application/octet-stream</param>
  10. <!-- 返回给浏览器的输入流 -->
  11. <!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法,
  12. 比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->
  13. <param name="inputName">inputStream</param>
  14. <!-- 告诉浏览器的方式下载资源 ${name}:获取Action中getName()方法的数据 -->
  15. <!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文 件保存的文件名,若未指定将会是以浏览的页面名作为文件名,如以
  16. download.action 作为文件名, 这里使用的是动态文件名,${name}, 它将通过 Action 的 getName() 获得文件名 -->
  17. <param name="contentDisposition">attachment;filename=${name}</param>
  18. <!-- 缓存大小 -->
  19. <param name="bufferSize">1024</param>
  20. </result>
  21. </action>

struts文件下载机制的更多相关文章

  1. struts 文件下载

    =============================struts 文件下载  ================================== 步骤一: JSP页面 <a href=& ...

  2. Hibernate工作原理及为什么要用?. Struts工作机制?为什么要使用Struts? spring工作机制及为什么要用?

    三大框架是用来开发web应用程序中使用的.Struts:基于MVC的充当了其中的试图层和控制器Hibernate:做持久化的,对JDBC轻量级的封装,使得我们能过面向对象的操作数据库Spring: 采 ...

  3. struts 文件下载 annotation 注解版

    [本文简介] 本文将简单介绍使用 struts2 ,通过零配置和 annotation 实现文件下载功能. [文件夹结构] [web.xml有关struts的配置] <filter> &l ...

  4. Struts工作机制

    Struts工作机制? 为什么要使用Struts?工作机制:Struts的工作流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config. ...

  5. Struts文件下载

    /* 文件下载的先决条件 * 1. 在xml配置文件中必须配置一个type="stream"的result, result中不需要填写任何内容 * 2. 在Action中编写一个接 ...

  6. Struts文件下载具体解释

    在做项目中上传下载肯定是少不了的,本博文对struts2的下载进行解释并附上部分代码 1.action类 public class FileDownLoadAction extends ActionS ...

  7. struts 异常机制

    1.try-catch 在Action中通过try-catch捕获异常,在catch中返回字符串, 通过返回的字符串在Action的result元素中进行匹配,最终返回响应的页面 2. 局部异常映射 ...

  8. Struts文件下载(静态)

    前言:在实际的开发中,我们可能需要动态下载和静态下载, 动态下载:例如我上传了一个文件,你想下载,那就必须动态生成下载链接,因为我服务器一开始是不知道我上传的东西是什么,放在那里, 静态下载:比如一些 ...

  9. Struts2 控制文件上传下载

    之前介绍servlet3.0新特性的时候有提到过servlet API提供了一个part类来实现对文件的上传和保存,Struts其实是在其基础上做了进一步的封装,更加简单易用.至于文件下载,Strut ...

随机推荐

  1. Linux设备树(一 概述)

    一 概述 设备树(Device tree)是一套用来描述硬件属相的规则.ARM Linux采用设备树机制源于2011年3月份Linux创始人Linus Torvalds发的一封邮件,在这封邮件中他提倡 ...

  2. PL/SQL Developper导入导出数据库的方法及说明

    导出步骤 1 tools ->export user object 选择选项,导出.sql文件. 2 tools ->export tables-> Oracle Export 选择 ...

  3. 面向对象【day08】:异常处理-断言(七)

    本节内容 1.概述 2.知识点回顾 3.断言 一.概述 python中断言,这个我是第一次听说到的,断言有什么用呢?断言就是做一些程序的检查工作,就是在执行之前需要做的一些检查,比如类似于安检一样,合 ...

  4. Java工具之上传文件

    4个代码 1.前端JSP 2.自定义异常类 3.文件上传抽象类 4.Servlet 1.JSP <%@ page contentType="text/html;charset=UTF- ...

  5. es安装的时候遇到的所有的坑

    不允许root用户启动. 解决办法,创建子用户. 在linux下需要注意.es默认不能用root用户启动.我们需要新建一个用户来启动. groupadd  es adduser  es-user    ...

  6. 解决 Ubuntu 经常 卡死

    ubuntu 的卡死可能与显卡驱动不兼容有关. 这里提供2种方式, 1.禁用原来自带的nouveau显卡驱动sudo gedit /etc/modprobe.d/blacklist.conf在最后一行 ...

  7. Python复习笔记(五)面向对象

    1. __init__方法 # 1. 为对象在内存 中分配空间 -- 创建对象 # 2. 为对象属性 设置初始值 -- 初始化方法(init)+-------------- # 3. __init__ ...

  8. 流媒体技术学习笔记之(十八)Ubuntu 16.04.3 如何编译 FFmpeg 记录

    官方文档:https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu 一.最简单安装: apt-get install ffmpeg 二.安装最新版本 大 ...

  9. python 可视化库

    在做titanic分析的过程中,看了一些大神的想法,发现在分析数据的过程中,许多大神会使用到seaborn,plotly这些库,而我等小白仅仅知道matplotlib这个唯一的数据可视化库而已.上网查 ...

  10. 深入浅出mybatis之入门使用

    写在前面 mybatis是一个持久层框架,可以支持SQL定制和存储过程,实现数据库记录到Java POJO对象之间的映射. 所以说,mybatis是一个ORM框架. 这个ORM可以通过2种方式实现:x ...