通过2种方式模拟单个文件上传,效果如下所示
开发步骤如下:
1、新建一个web工程,导入struts2上传文件所需jar,如下图
目录结构
2、新建Action
第一种方式
package
com.ljq.action;
import
java.io.File;
import
org.apache.commons.io.FileUtils;
import
org.apache.struts2.ServletActionContext;
import
com.opensymphony.xwork2.ActionContext;
import
com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(
"
serial
"
)
public
class
UploadAction
extends
ActionSupport{
private
File image;
//
上传的文件
private
String imageFileName;
//
文件名称
private
String imageContentType;
//
文件类型
public
String execute()
throws
Exception { String realpath
=
ServletActionContext.getServletContext().getRealPath(
"
/images
"
);
//
D:\apache-tomcat-6.0.18\webapps\struts2_upload\images
System.out.println(
"
realpath:
"
+
realpath);
if
(image
!=
null
) { File savefile
=
new
File(
new
File(realpath), imageFileName);
if
(
!
savefile.getParentFile().exists()) savefile.getParentFile().mkdirs(); FileUtils.copyFile(image, savefile); ActionContext.getContext().put(
"
message
"
,
"
文件上传成功
"
); }
return
"
success
"
; }
public
File getImage() {
return
image; }
public
void
setImage(File image) {
this
.image
=
image; }
public
String getImageFileName() {
return
imageFileName; }
public
void
setImageFileName(String imageFileName) {
this
.imageFileName
=
imageFileName; }
public
String getImageContentType() {
return
imageContentType; }
public
void
setImageContentType(String imageContentType) {
this
.imageContentType
=
imageContentType; } }
第二种方式
package
com.ljq.action;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
org.apache.struts2.ServletActionContext;
import
com.opensymphony.xwork2.ActionSupport; @SuppressWarnings(
"
serial
"
)
public
class
UploadAction2
extends
ActionSupport {
//
封装上传文件域的属性
private
File image;
//
封装上传文件类型的属性
private
String imageContentType;
//
封装上传文件名的属性
private
String imageFileName;
//
接受依赖注入的属性
private
String savePath; @Override
public
String execute() { FileOutputStream fos
=
null
; FileInputStream fis
=
null
;
try
{
//
建立文件输出流
System.out.println(getSavePath()); fos
=
new
FileOutputStream(getSavePath()
+
"
\\
"
+
getImageFileName());
//
建立文件上传流
fis
=
new
FileInputStream(getImage());
byte
[] buffer
=
new
byte
[
1024
];
int
len
=
0
;
while
((len
=
fis.read(buffer))
>
0
) { fos.write(buffer,
0
, len); } }
catch
(Exception e) { System.out.println(
"
文件上传失败
"
); e.printStackTrace(); }
finally
{ close(fos, fis); }
return
SUCCESS; }
/**
* 返回上传文件的保存位置 * *
@return
*/
public
String getSavePath()
throws
Exception{
return
ServletActionContext.getServletContext().getRealPath(savePath); }
public
void
setSavePath(String savePath) {
this
.savePath
=
savePath; }
public
File getImage() {
return
image; }
public
void
setImage(File image) {
this
.image
=
image; }
public
String getImageContentType() {
return
imageContentType; }
public
void
setImageContentType(String imageContentType) {
this
.imageContentType
=
imageContentType; }
public
String getImageFileName() {
return
imageFileName; }
public
void
setImageFileName(String imageFileName) {
this
.imageFileName
=
imageFileName; }
private
void
close(FileOutputStream fos, FileInputStream fis) {
if
(fis
!=
null
) {
try
{ fis.close(); }
catch
(IOException e) { System.out.println(
"
FileInputStream关闭失败
"
); e.printStackTrace(); } }
if
(fos
!=
null
) {
try
{ fos.close(); }
catch
(IOException e) { System.out.println(
"
FileOutputStream关闭失败
"
); e.printStackTrace(); } } } }
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
>
<!--
该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配
*
.action的请求都由Struts2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
-->
<
constant name
=
"
struts.action.extension
"
value
=
"
do
"
/>
<!--
设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
-->
<
constant name
=
"
struts.serve.static.browserCache
"
value
=
"
false
"
/>
<!--
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
-->
<
constant name
=
"
struts.configuration.xml.reload
"
value
=
"
true
"
/>
<!--
开发模式下使用,这样可以打印出更详细的错误信息
-->
<
constant name
=
"
struts.devMode
"
value
=
"
true
"
/>
<!--
默认的视图主题
-->
<
constant name
=
"
struts.ui.theme
"
value
=
"
simple
"
/>
<!--<
constant name
=
"
struts.objectFactory
"
value
=
"
spring
"
/>-->
<!--
解决乱码
-->
<
constant name
=
"
struts.i18n.encoding
"
value
=
"
UTF-8
"
/>
<!--
指定允许上传的文件最大字节数。默认值是2097152(2M)
-->
<
constant name
=
"
struts.multipart.maxSize
"
value
=
"
10701096
"
/>
<!--
设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir
-->
<
constant name
=
"
struts.multipart.saveDir
"
value
=
"
d:/tmp
"
/>
<
package
name
=
"
upload
"
namespace
=
"
/upload
"
extends
=
"
struts-default
"
>
<
action name
=
"
*_upload
"
class
=
"
com.ljq.action.UploadAction
"
method
=
"
{1}
"
>
<
result name
=
"
success
"
>/
WEB
-
INF
/
page
/
message.jsp
</
result
>
</
action
>
</
package
>
<
package
name
=
"
upload2
"
extends
=
"
struts-default
"
>
<
action name
=
"
upload2
"
class
=
"
com.ljq.action.UploadAction2
"
method
=
"
execute
"
>
<!--
动态设置savePath的属性值
-->
<
param name
=
"
savePath
"
>/
images
</
param
>
<
result name
=
"
success
"
>/
WEB
-
INF
/
page
/
message.jsp
</
result
>
<
result name
=
"
input
"
>/
upload
/
upload.jsp
</
result
>
<
interceptor
-
ref name
=
"
fileUpload
"
>
<!--
文件过滤
-->
<
param name
=
"
allowedTypes
"
>
image
/
bmp,image
/
png,image
/
gif,image
/
jpeg
</
param
>
<!--
文件大小, 以字节为单位
-->
<
param name
=
"
maximumSize
"
>
1025956
</
param
>
</
interceptor
-
ref
>
<!--
默认拦截器必须放在fileUpload之后,否则无效
-->
<
interceptor
-
ref name
=
"
defaultStack
"
/>
</
action
>
</
package
>
</
struts
>
上传表单页面
<%
@ page language
=
"
java
"
import
=
"
java.util.*
"
pageEncoding
=
"
UTF-8
"
%>
<%
@taglib uri
=
"
/struts-tags
"
prefix
=
"
s
"
%>
<!
DOCTYPE HTML PUBLIC
"
-//W3C//DTD HTML 4.01 Transitional//EN
"
>
<
html
>
<
head
>
<
title
>
文件上传
</
title
>
<
meta http
-
equiv
=
"
pragma
"
content
=
"
no-cache
"
>
<
meta http
-
equiv
=
"
cache-control
"
content
=
"
no-cache
"
>
<
meta http
-
equiv
=
"
expires
"
content
=
"
0
"
>
</
head
>
<
body
>
<!--
${pageContext.request.contextPath}
/
upload
/
execute_upload.
do
-->
<!--
${pageContext.request.contextPath}
/
upload2
/
upload2.
do
-->
<
form action
=
"
${pageContext.request.contextPath}/upload2/upload2.do
"
enctype
=
"
multipart/form-data
"
method
=
"
post
"
>
文件:
<
input type
=
"
file
"
name
=
"
image
"
>
<
input type
=
"
submit
"
value
=
"
上传
"
/>
</
form
>
<
br
/>
<
s:fielderror
/>
</
body
>
</
html
>
显示结果页面
<%
@ page language
=
"
java
"
import
=
"
java.util.*
"
pageEncoding
=
"
UTF-8
"
%>
<%
@ taglib uri
=
"
/struts-tags
"
prefix
=
"
s
"
%>
<!
DOCTYPE HTML PUBLIC
"
-//W3C//DTD HTML 4.01 Transitional//EN
"
>
<
html
>
<
head
>
<
title
>
上传成功
</
title
>
<
meta http
-
equiv
=
"
pragma
"
content
=
"
no-cache
"
>
<
meta http
-
equiv
=
"
cache-control
"
content
=
"
no-cache
"
>
<
meta http
-
equiv
=
"
expires
"
content
=
"
0
"
>
</
head
>
<
body
>
上传成功!
<
br
/><
br
/>
<!--
${pageContext.request.contextPath} tomcat部署路径, 如:D:\apache
-
tomcat
-
6.0
.
18
\webapps\struts2_upload\
-->
<
img src
=
"
${pageContext.request.contextPath}/<s:property value=
"'
images/
'
+
imageFileName
"
/>
"
>
<
s:debug
></
s:debug
>
</
body
>
</
html
>