本节主要介绍上传任意数据的文件、指定文件类型上传与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..." οnclick="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>