本节主要介绍上传任意数据的文件、指定文件类型上传与Struts2的下载
1,首先改造upload.jsp,写了个JS事件,可以添加删除上传框。可以上传任意多(大于等于1)个文件!
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <script type="text/javascript"> function addMore() { var td = document.getElementById("more"); var br = document.createElement("br"); var input = document.createElement("input"); var button = document.createElement("input"); input.type="file"; input.name="file"; button.type="button"; button.value="Remove"; button.onclick = function(){ td.removeChild(br); td.removeChild(input); td.removeChild(button); } td.appendChild(br); td.appendChild(input); td.appendChild(button); } </script> <body> <table> <tr><td> <s:fielderror cssStyle="color:red"/> </td></tr> </table> <s:form action="upload" theme="simple" enctype="multipart/form-data"> <table align="center" width="40%"> <tr> <td>username:</td> <td><s:textfield name="username"></s:textfield></td> </tr> <tr> <td>password:</td> <td><s:password name="password"></s:password></td> </tr> <tr> <td>file:</td> <td id="more"><!-- 定义一个id,方便javascript调用 --> <s:file name="file"></s:file> <input type="button" value="Add More..." onclick="addMore()"> </td> </tr> <tr> <td><s:submit></s:submit></td> <td><s:reset></s:reset></td> </tr> </table> </s:form> </body> </html>
2,UploadAction.java
package com.test.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport { private String username; private String password; private List<File> file; //下面两个变量是文件名与文件类型,Struts2会自动为以下两变量赋值 private List<String> fileFileName; private List<String> fileContentType; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List<File> getFile() { return file; } public void setFile(List<File> file) { this.file = file; } public List<String> getFileFileName() { return fileFileName; } public void setFileFileName(List<String> fileFileName) { this.fileFileName = fileFileName; } public List<String> getFileContentType() { return fileContentType; } public void setFileContentType(List<String> fileContentType) { this.fileContentType = fileContentType; } public String execute() throws Exception { for(int i = 0;i < file.size(); i++){ InputStream is = new FileInputStream(file.get(i)); String root = ServletActionContext.getRequest().getRealPath("upload"); File destFile = new File(root,this.getFileFileName().get(i)); OutputStream os = new FileOutputStream(destFile); byte[] buffer = new byte[400]; int length = 0; while((length= is.read(buffer)) > 0){ os.write(buffer, 0, length); } is.close(); os.close(); } return SUCCESS; } }
3,struts.xml
<action name="upload" class="com.test.action.UploadAction"> <result name="success">/uploadResult.jsp</result> <result name="input">/upload.jsp</result> <interceptor-ref name="fileUpload"> <!--指定上传文件大小,下面是400K--> <param name="maximumSize">409600</param> <!--指定上传文件类型,这里只允许上传PPT文件,文件类型名可以在Tomcat的conf\web.xml中查找--> <param name="allowedTypes">application/vnd.ms-powerpoint</param> </interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref> </action>
以上就完成了一个多文件,指定文件类型上传功能。
Struts2的下载实现
download.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <body> <s:a href="/struts2/download.action">downlaod</s:a> </body> </html>
DownloadAction.java
package com.test.action; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class DownloadAction extends ActionSupport { public InputStream getDownloadFile(){ return ServletActionContext.getServletContext().getResourceAsStream("upload/11.ppt"); } public String execute() throws Exception { return SUCCESS; } }
struts.xml
<action name="download" class="com.test.action.DownloadAction"> <result name="success" type="stream"> <!--下载文件的类型--> <param name="contentType">application/vnd.ms-powerpoint</param> <!--指定下载文件的默认文件名--> <param name="contentDisposition">filename="Struts2.ppt"</param> <!--对应的getDownloadFile类中的getDownloadFile方法--> <param name="inputName">downloadFile</param> </result> </action>