文件上传的概述:文件上传是将本地文件上传到服务器的指定目录下。要使用Struts2进行文件上传,首先将form表单的enctype属性值设置为multipart/form-data。文件上传还需要用到<s:file>标签,该标签是一个表单标签,要放在<s:form>标签中。
实战(单文件上传)
(1)在eclipse中创建Web项FileUp,添加相应的JAR包和web.xml文件,并在web.xml文件中配置好Struts2的核心过滤器。
(2)新建上传单个文件的JSP页面fileUpload.jsp,在页面中创建form表单,并修改form表单中的enctype属性值为“multipart/form-data”,同时设置method属性值为“post”。
fileUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传页面</title>
</head>
<body>
<s:form action="fileUpload" method="post" enctype="multipart/form-data" >
<s:file name="file" label="上传文件"/>
<s:submit value="上传"/>
<s:reset value="重置"/>
</s:form>
</body>
</html>
(3)在src目录下新建cn.itcast.action包,在此包中建立FileUploadAction.java文件。此文件用来接收上传的文件,在执行方法中,完成文件上传功能,
FileUploadAction.java
package cn.itcast.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport{
private static final long serialVersionUID=1;
//提交过来的文件
private File file;
//提交过来的file名字
private String fileFileName;
//提交过来的file类型
private String fileContentType;
public File getFile() {
return file;
}
//三个属性的getter和setter方法
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public String execute() throws Exception{
//文件输入流
InputStream is=new FileInputStream(file);
//设置文件保存目录
String uploadPath=ServletActionContext.getServletContext()
.getRealPath("/upload");
//设置目标文件
System.out.println("路径为:"+uploadPath);
File toFile=new File(uploadPath,this.getFileFileName());
//文件输出流
OutputStream os=new FileOutputStream(toFile);
byte[] buffer=new byte[1024];
@SuppressWarnings("unused")
int length=0;
//读取file文件输出到toFile文件中
while (-1 !=(length=is.read(buffer,0,buffer.length))) {
os.write(buffer);
}
//关闭输入流和输出流
is.close();
os.close();
return SUCCESS;
}
}
三个属性,分别包括file、fileFileName、fileContentType,file属性的名称与表单中文本域的参数必须相同 ,其类型为File,它用来保存封装的上传文件。一般来说,Action中的属性与表单中提交的参数是相对应的,但在此表单中并没用提交fileFileName和fileContentType这连个参数,因为这两个参数是由FileUploadIntercepter(文件上传拦截器)来负责填充的,由FileUploadIntercepter对其属性值进行设置。fileFileName属性用来保存上传文件的名称,fileContentType用来保存上传文件的类型。在execute()方法中通过输入流来读取File文件中的数据,通过取得上传文件名和上传目录,构造了一个目标文件,并通过循环输出流将数据写到目标文件中,最后关闭输入输出流。
(4)新建上传结果页面result.jsp,此文件用来显示上传结果,包括文件名和类型
result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>result</title>
</head>
<body>
文件上传成功!<br>
上传文件名:${fileFileName}<br>
上传文件类型:${fileContentType}
</body>
</html>
(5)配置struts.xml文件,在package节点下添加一个action节点,在action节点中配置文件上传控制器对应的视图文件
struts.xml
<?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="struts2" extends="struts-default" namespace="/">
<action name="fileUpload" class="cn.itcast.action.FileUploadAction">
<result name="success">/result.jsp</result>
</action>
</package>
</struts>
(6)部署项目,在浏览器中输入http://localhost:8080/FileUp/fileUpload.jsp
如果不知道文件路径,可以通过控制台输出,