struts 文件上传下载
Posted 酒香逢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts 文件上传下载相关的知识,希望对你有一定的参考价值。
上传
1、编写上传action类 UploadAction.java
1 package jxf.b_upload; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 import javax.servlet.http.HttpServletRequest; 7 8 import org.apache.commons.io.FileUtils; 9 import org.apache.struts2.ServletActionContext; 10 11 public class UploadAction { 12 public File file01;//上传的文件 --对应表单中的<input type="file" name="file01"> name的值 13 public String file01FileName;//上传文件的文件名 --表单中name的值+FileName 14 public String file01ContentType;// 上传文件的文件的类型(MIME) --表单中name的值+ContentType 15 16 public void setFile01(File file01) { 17 this.file01 = file01; 18 } 19 20 public void setFile01FileName(String file01FileName) { 21 this.file01FileName = file01FileName; 22 } 23 24 public void setFileContentType(String file01ContentType) { 25 this.file01ContentType = file01ContentType; 26 } 27 28 /** 29 * 上传 30 * @return 31 */ 32 public String upload() { 33 //处理文件 把文件上传到upload目录 34 try { 35 //创建目标文件 36 File destFile = new File(ServletActionContext.getServletContext().getRealPath("/upload"),file01FileName); 37 //拷贝上传的文件到目标文件 38 FileUtils.copyFile(file01, destFile); 39 System.out.println("上传完成"); 40 } catch (IOException e) { 41 e.printStackTrace(); 42 throw new RuntimeException(e); 43 } 44 return "success"; 45 } 46 }
2、配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- struts默认的上传文件大小限制是2M,可通过常量的配置来改变 --> <constant name="struts.multipart.maxSize" value="10485760"></constant> <package name="upload_" extends="struts-default"> <action name="uploadTest" class="jxf.b_upload.UploadAction" method="upload"> <!-- 限制运行上传的文件的类型 --> <interceptor-ref name="defaultStack"> <!-- 限制运行的文件的扩展名 <param name="fileUpload.allowedExtensions">txt,jpg,jar</param> --> <!-- 限制运行的类型 【与上面同时使用,取交集】 <param name="fileUpload.allowedTypes">text/plain</param> --> </interceptor-ref> <!-- 错误视图 --> <result name="input">/error.jsp</result> <result name="success">/index.jsp</result> </action> </package> </struts>
3、前台jsp页面
<body> <form action="${pageContext.request.contextPath}/uploadTest" method="post" enctype="multipart/form-data"> <input type="file" name="file01"> <input type="submit" value="上传"> </form> </body>
如果是多文件上传,可以使用同名的<input type="file" name="">标签,并在action处理类中用数组接收(当然也可以用不同的name值,并用对应的字段接收),然后遍历处理
1 public class UploadAction { 2 public File[] file01;//上传的文件 --对应表单中的<input type="file" name="file01"> name的值 3 public String[] file01FileName;//上传文件的文件名 --表单中name的值+FileName 4 public String[] file01ContentType;// 上传文件的文件的类型(MIME) --表单中name的值+ContentType 5 6 public void setFile01(File[] file01) { 7 this.file01 = file01; 8 } 9 10 public void setFile01FileName(String[] file01FileName) { 11 this.file01FileName = file01FileName; 12 } 13 14 public void setFileContentType(String[] file01ContentType) { 15 this.file01ContentType = file01ContentType; 16 } 17 18 /** 19 * 上传 20 * @return 21 */ 22 public String upload() { 23 //处理文件 把文件上传到upload目录 24 try { 25 //创建目标文件 26 for (int i = 0; i < file01.length; i++) { 27 File destFile = new File(ServletActionContext.getServletContext().getRealPath("/upload"),file01FileName[i]); 28 //拷贝上传的文件到目标文件 29 FileUtils.copyFile(file01[i], destFile); 30 System.out.println("上传完成"); 31 } 32 33 } catch (IOException e) { 34 e.printStackTrace(); 35 throw new RuntimeException(e); 36 } 37 return "success"; 38 } 39 }
<form action="${pageContext.request.contextPath}/uploadTest" method="post" enctype="multipart/form-data"> <input type="file" name="file01"> <input type="file" name="file01"> <input type="file" name="file01"> <input type="submit" value="上传"> </form>
下载:
1、编写下载acton类 DownAction.java
1 package jxf.b_upload; 2 3 import java.io.File; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.net.URLEncoder; 7 import java.util.Map; 8 9 import org.apache.struts2.ServletActionContext; 10 11 import com.opensymphony.xwork2.ActionContext; 12 13 public class DownAction { 14 15 /** 16 * 1. 显示所有要下载文件的列表 17 * @return 18 */ 19 public String list(){ 20 //获取所有要下载的文件 21 File file = new File(ServletActionContext.getServletContext().getRealPath("/upload")); 22 String[] fileNames = file.list();//所有文件名 23 ActionContext ac = ActionContext.getContext(); 24 Map<String,Object> request = ac.getContextMap(); 25 request.put("fileNames", fileNames);//将文件名放入request 26 return "list"; 27 } 28 29 /*************2. 文件下载*********************/ 30 // 1. 获取要下载的文件的文件名 31 private String fileName;//对应提交的参数名 32 public void setFileName(String fileName) { 33 // 处理传入的参数中问题(get提交) 34 try { 35 fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8"); 36 } catch (UnsupportedEncodingException e) { 37 throw new RuntimeException(e); 38 } 39 // 把处理好的文件名,赋值 40 this.fileName = fileName; 41 } 42 43 //2. 下载提交的业务方法 (在struts.xml中配置返回stream) 44 public String down() throws Exception { 45 return "success"; 46 } 47 48 // 3. 返回文件流的方法 49 public InputStream getAttrInputStream(){ 50 return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName); 51 } 52 53 // 4. 下载显示的文件名(浏览器显示的文件名) 54 public String getDownFileName() { 55 // 需要进行中文编码 56 try { 57 fileName = URLEncoder.encode(fileName, "UTF-8"); 58 } catch (UnsupportedEncodingException e) { 59 throw new RuntimeException(e); 60 } 61 return fileName; 62 } 63 64 }
2、配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="down_" extends="struts-default"> <action name="downlist" class="jxf.b_upload.DownAction" method="list"> <result name="list">/down.jsp</result> </action> <action name="down_down" class="jxf.b_upload.DownAction" method="down"> <result name="success" type="stream"> <!-- 运行下载的文件的类型:指定为所有的二进制文件类型 --> <param name="contentType">application/octet-stream</param> <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 --> <param name="inputName">attrInputStream</param> <!-- 下载头,包括:浏览器显示的文件名 ${downFileName},${}为struts中的取值符,downFileName对应getDownFileName()--> <param name="contentDisposition">attachment;filename=${downFileName}</param> <!-- 缓冲区大小设置 --> <param name="bufferSize">1024</param> </result> </action> </package> </struts>
3、下载列表jsp
<body> <table border="1" align="center"> <tr> <td>序号</td> <td>文件名</td> <td>操作</td> </tr> <c:forEach var="item" items="${fileNames}" varStatus="sta"> <tr> <td>${sta.count}</td> <td>${item}</td> <td> <c:url var="url" value="down_down"> <c:param name="fileName" value="${item}"></c:param> </c:url> <a href="${url}">下载</a> </td> </tr> </c:forEach> </table> </body>
下载编写方式比较特殊,并不容易记忆,此处记录方便以后用到查阅。
以上是关于struts 文件上传下载的主要内容,如果未能解决你的问题,请参考以下文章