struts2实现文件上传(一)

时间:2022-08-30 10:00:53

一、文件上传步骤

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>

二、效果

struts2实现文件上传(一)

struts2实现文件上传(一)

三、结束语

//文件保存位置
//注意这个位置是web应用部署的uploadFiles目录下,而不是工作空间下的uploadFiles目录下
D:\tomcat8.0\tomcat_dir\webapps\WebTest\uploadFiles