实现文件上传工程坏境搭建如下:
Struts2相关jar包:
1.在web.xml配置核心过滤器
<!-- 配置struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern><!-- 映射的路径 -->
</filter-mapping>
2.在src目录下新建struts.xml文件内容如下:
<span style="font-size:12px;"><!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="action" namespace="/" extends="struts-default">
<action name="upload" class="cn.lsh.web.struts2.upload.UploadAction" method="execute">
<result name="success" type="dispatcher">/WEB-INF/jsp/message.jsp</result>
<!--
<interceptor-ref name="fileUpload">
向fielUpload拦截器注入参数
允许上传的文件大小,这里是设置为5M(如果超过5M则会包异常)
<param name="maximumSize">1024*1024*5</param>
设置文件扩展名
<param name="allowedExtensions">.jpg/.txt</param>
设置文件类型
<param name="allowedTypes">image/jpeg/jpg/txt</param>
</interceptor-ref>
-->
</action>
</package>
<!-- 配置上传文件临时保存目录,如果没有配置则会报:提示该 struts.multipart.saveDir属性未设置异常</span><span style="font-family: Arial, Helvetica, sans-serif;">--></span><span style="font-size:12px;">
<constant name="struts.multipart.saveDir" value="/upload"/>
</struts></span>
3,新建UploadAtcion继承ActionSupport类(默认重载validate()和execute()方法)
public class UploadAction extends ActionSupport {
private String username;
//以下三个属性,fileUpload拦截器自动闯入
private File upload;//上传文件
private String uploadContentType;//上传文件类型
private String uploadFileName;//上传文件名
public void setUsername(String username) {
this.username = username;
}
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
//默认验证成功
@Override
public void validate() {
super.validate();
}
//上传业务控制方法
public String execute() throws Exception {
System.out.println("上传文件中。。。。");
//指定上传文件的临时保存目录位置
String path = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
InputStream in = new FileInputStream(this.upload);
OutputStream out = new FileOutputStream(path+"\\"+this.uploadFileName);
int len = 0;
byte[] by = new byte[1024];
while((len=in.read(by))>0){
out.write(by,0,len);
}
in.close();
out.close();
return "success";
}
}
4,新建一个upload.jsp上传的页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传文件</title>
</head>
<body>
<!-- enctype="multipart/form-data:指定对上传表单项进行URL编码 -->
<form action="${pageContext.request.contextPath }/upload.action" method="post" enctype="multipart/form-data">
<table align="center" border="1">
<caption><h2>上传</h2></caption>
<tr>
<td>上传用户名:</td>
<td><input type="text" name="username"/></td>
</tr><tr>
<td>上传文件:</td>
<td><input type="file" name="upload"/></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="上传"/></td>
</tr>
</table>
</form>
</body>
</html>
测试:在浏览器中输入http://localhost:8080/struts3/upload.jsp
访问页面如下:
上传文件报错异常,测试坏境中出现如下异常:
2016-7-2 12:15:39 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
上传文件中。。。。
报错分析:提示该 struts.multipart.saveDir属性未设置。
上述信息告诉我们,struts.multipart.saveDir没有配置。
struts.multipart.saveDir用于指定存放临时文件的文件夹,该配置写在struts.properties文件或者struts.xml配置文件中。例如,如果是struts.properties文件,则加入如下代码:struts.multipart.saveDir = /tmp/;或者是struts.xml配置文件,则增加如下代码:<constant name="struts.multipart.saveDir" value="/tmp"/>,设置临时文件上传路径。就能解决此问题。
解决方式一(可在struts.xml文件中配置j加入如下属性):
<constant name="struts.multipart.saveDir" value="/upload"/>
解决方式二(可在struts.proerties文件中配置如下属性):
struts.multipart.saveDir=/upload
解决方式三(可在web.xml文件中把<url-pattern>/*</url-pattern>配置成<url-pattern>*.action</url-pattern>
测试三种配置方式:查看上传文件临时保存目录,E:\apache-tomcat-6.0.39\webapps\struts3\WEB-INF\upload,文件上传成功(完美解决异常)!