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;//上传的文件 --对应表单中的 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> <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"> interceptor-ref> <result name="input">/error.jspresult> <result name="success">/index.jspresult> 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>
如果是多文件上传,可以使用同名的标签,并在action处理类中用数组接收(当然也可以用不同的name值,并用对应的字段接收),然后遍历处理
1 public class UploadAction { 2 public File[] 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 Maprequest = 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.jspresult> action> <action name="down_down" class="jxf.b_upload.DownAction" method="down"> <result name="success" type="stream"> <param name="contentType">application/octet-streamparam> <param name="inputName">attrInputStreamparam> <param name="contentDisposition">attachment;filename=${downFileName}param> <param name="bufferSize">1024param> 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>
下载编写方式比较特殊,并不容易记忆,此处记录方便以后用到查阅。