一、文件上传步骤
Step1:引入jar包
xxx表示的是版本号,将下载的struts2解压后在lib目录下找到以下几个文件,将其复制到Web项目的WebRoot/WEB-INF/lib目录下。
//引入struts所需jar包和upload所需jar包
commons-fileupload-xxx.jar
commons-io-xxx.jar
commons-logging-xxx.jar
freemarker-xxx.jar
ognl-xxx.jar
struts2-core-xxx.jar
xwork-core-xxx.jar
Step2:编写静态页面 upload.jsp
我们使用的是struts2的UI控件,所以首先引入struts的标签库。
<!-- 引入struts的标签库 -->
<%@taglib prefix="s" uri="/struts-tags" %>
注意这里form表单的enctype属性值必须是multipart/form-data,否则不能上传,当点击上传按钮后表单会被提交到uploadAction.action。
<body>
<s:form action="uploadAction" enctype="multipart/form-data">
<s:textfield name="title" label="文件标题"></s:textfield>
<s:file name="upload" label="选择文件"/>
<s:submit value="上传"></s:submit>
</s:form>
</body>
Step3:创建UploadAction
上一步中表单会被提交到uploadAction,我们需要定义一个uploadAction的处理类UploadAction处理文件上传请求。
注意一下:表单提交的是uploadAction,我们定义的是UploadAction,这两者是不一样的,提交的是Action的名字,而UploadAction是Action的处理类,所以我们需要在struts.xml文件中进行配置两者的映射关系。
package cn.lzf.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 文件上传
* @author Administrator
*
*/
public class UploadAction extends ActionSupport {
//文件标题
private String title;
//上传的文件
private File upload;
//上传的文件类型
private String uploadContentType;
//文件名
private String uploadFileName;
//保存的路径
private String savePath;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
/**
* 获取到文件保存的路径,该路径是在struts.xml中当成参数配置的
* @return
*/
public String getSavePath() {
return ServletActionContext.getServletContext().getRealPath(savePath);
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public UploadAction() {
// TODO Auto-generated constructor stub
}
/**
* 父类ActionSupport的方法
* Action执行的方法
*/
@Override
public String execute() throws Exception {
//获取待保存文件的位置的输出流
FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+getUploadFileName());
//获取上传文件的输入流
FileInputStream fis=new FileInputStream(getUpload());
//缓冲数组
byte[] buff=new byte[1024];
//不断将输入流中的数据写入输出流
int len=0;
while((len=fis.read(buff))>0){
fos.write(buff,0,len);
}
//返回 成功标志
return SUCCESS;
}
}
Step4:配置UploadAction
定义好UploadAction,接下来需要配置Action字和Action处理类的映射关系,修改src/struts.xml文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="lzf" namespace="/" extends="struts-default">
<action name="uploadAction" class="cn.lzf.action.UploadAction">
<param name="savePath">/uploadFiles</param>
<result name="success">/WEB-INF/struts2Test/day04/succ.jsp</result>
</action>
</package>
</struts>
在<action></action>标签中有两个元素,param表示参数,该参数会传入Action内;result定义的是逻辑视图名和资源的映射关系,Action对请求处理后会返回逻辑视图名,result标签的name属性表示的是逻辑视图名,当Action返回的逻辑视图名为success时会跳转到对应的资源文件,所以如果upload处理成功后会跳转到succ.jsp页面。
Step5:定义成功后的页面 succ.jsp
页面很简单,引入标签库,然后输出文件标题并将其作为图片显示出来
<!-- 引入struts的标签库 -->
<%@taglib prefix="s" uri="/struts-tags" %>
<body>
文件上传成功!
<s:property value=" + title"/><br>
<img alt="" src="<s:property value="'uploadFiles/'+uploadFileName"/>">
</body>
二、效果
三、结束语
//文件保存位置
//注意这个位置是web应用部署的uploadFiles目录下,而不是工作空间下的uploadFiles目录下
D:\tomcat8.0\tomcat_dir\webapps\WebTest\uploadFiles