Struts2教程7:上传任意多个文件
在Web
程序中的上传文件的功能一般会使用<input type=file.../>
标签在客户端显示输入要上传的文件名的用户接口。如果读者使用过JSP/Servlet
来处理客户端上传的文件就会知道,实现这个功能并不是很容易。而在Struts
中为我们提供了一种机制,可以非常方便地将客户端上传的文件保存在服务端。
在
Struts Html
标签库中提供了一个<html:file>
标签,可以和FormFile
类型的属性一起使用。通过这个属性返回的FormFile
对象,就可以很方便地获得上传文件的InputStream
对象,并做进一步地处理。
在Struts
中,一个FormFile
对象代表一个上传的文件。FormFile
实际上是一个接口,我们可以在org.apache.struts.upload
包中找到这个接口。FormFile
接口有如下五个常用的方法:
1. getInputStream()
方法
这个方法用于获得上传文件的java.io.InputStream
对象,我们可以从这个InputStream
对象中读取上传文件的数据,并将其写到服务端指定的路径下。
2. getFileData()
方法
这个方法用于将上传文件的整个内容放到一个byte
类型的数组中,如果上传文件的尺寸比较小的话,使用这个方法可以很方便地将上传文件保存到在服务端的指定路径中。
3. getFileName()
方法
这个方法用于获得上传文件的文件名(不包括文件在客户机的路径部分)。
4. getFileSize()方法
这个方法用于获得上传文件的字节数。
5. destroy()方法
用于销毁所有和当前上传文件相关的资源。
下面的例子演示了如何使用<html:file>标签和FormFile对象来上传单个文件。实现这个例子需要如下六步:
【第1步】建立上传文件的JSP页面
在<samples工程目录>目录中建立一个uploadFile.jsp文件,代码如下:
<%
@ page pageEncoding
=
"
GBK
"
%>
<%
@ taglib uri
=
"
http://struts.apache.org/tags-html
"
prefix
=
"
html
"
%>
<
html
>
<
head
>
<
title
>
上传单个文件(文件大小不能超过2M)
</
title
>
</
head
>
<
body
>
<%
--
在
<
html:form
>
标签中必须加enctype
=
"
multipart/form-data
"
--
%>
<
html:form
enctype
="multipart/form-data"
action
="uploadFile"
>
<
html:file
property
="myFile"
/><
p
>
<%
--
使用
<
html:file
>
标签让用户输入上传文件名
--
%>
<
html:submit
value
="上传"
/>
</
html:form
>
</
body
>
</
html
>
【第2步】建立ActionForm的子类
在<samples工程目录>"src"actionform目录中建立一个UploadForm.java文件,代码如下:
package
actionform;
import
org.apache.struts.action.
*
;
import
org.apache.struts.upload.FormFile;
public
class
UploadForm
extends
ActionForm
{
private
FormFile myFile;
//
这个myFile代表要上传的文件
public
FormFile getMyFile()
{
return
myFile;
}
public
void
setMyFile(FormFile myFile)
{
this
.myFile
=
myFile;
}
}
【第3步】建立Struts动作类(Action的子类)
在Struts中,一般在Struts的动作类中处理上传的文件。在<samples工程目录>"src"action目录中建立一个UploadAction.java文件,代码如下:
package
action;
import
javax.servlet.http.
*
;
import
org.apache.struts.action.
*
;
import
org.apache.struts.upload.FormFile;
import
java.io.
*
;
import
actionform.
*
;
public
class
UploadAction
extends
Action
{
protected
void
saveFile(FormFile formFile)
throws
Exception
{
//
从web.xml文件中获得指定的上传路径
String path
=
this
.getServlet().getServletConfig().getInitParameter(
"
uploadPath
"
);
InputStream in
=
formFile.getInputStream();
//
获得上传文件的InputStream
//
在服务端指定的上传路径中建立一个空的文件(文件名为getFileName()方法返回的值)
FileOutputStream fout
=
new
FileOutputStream(path
+
formFile.getFileName());
byte
buffer[]
=
new
byte
[
8192
];
int
count
=
0
;
//
开始向上传路径中刚建立的文件写入数据,每次写8k字节
while
((count
=
in.read(buffer))
>
0
)
{
fout.write(buffer,
0
, count);
}
fout.close();
formFile.destroy();
//
上传成功后,销毁当前上传文件的资源
}
public
ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
UploadForm uForm
=
(UploadForm) form;
PrintWriter out
=
null
;
try
{
response.setCharacterEncoding(
"
GBK
"
);
out
=
response.getWriter();
saveFile(uForm.getMyFile());
//
将上传文件保存到指写的路径(在web.xml中配置)
out.println(
"
上传文件成功.
"
);
}
catch
(Exception e)
{
out.println(e.getMessage());
}
return
null
;
}
}
在saveFile方法中,首先从web.xml的Servlet初始化参数中获得一个用于保存上传文件的路径。然后从FormFile对象中获得上传文件的InputStream对象,并对这个InputStream对象中的字节进行循环读取,并写到新的文件中。最后,在上传成功后,将FormFile对象销毁。
【第4步】配置struts-config.xml
在这一步来配置一下在第2步和第3步分别建立的ActionForm和Action的子类。打开struts-config.xml文件,在<form-beans>中加入如下的子标签:
<
form-bean
name
="uploadForm"
type
="actionform.UploadForm"
/>
在<action-mappings>中加入如下的子标签:
<
action
name
="uploadForm"
path
="/uploadFile"
scope
="request"
type
="action.UploadAction"
/>
【第5步】设置用于保存上传文件的路径
打开web.xml文件,找到一个叫action的Servlet(也就是用于处理Struts动作的Servlet),并在<servlet>中加入如下的子标签(假设保存上传文件的路径为D:"upload",路径的最后一个字符必须是“"”):
<
init-param
>
<
param-name
>
uploadPath
</
param-name
>
<
param-value
>
D:\upload\
</
param-value
>
</
init-param
>
【第
6
步】
限制上传文件的大小
这一步是可选的,如果不限制上传文件的大小,就意味着可以上传任意大小的文件。而一般的应用程序,如电子相册,网络硬盘都会限制上传文件的最大尺寸。
打开struts-config.xml文件,在<struts-config>中加入如下的子标签:
<
controller
maxFileSize
="2M"
/>
st1":*{behavior:url(#ieooui) }
上面的<controller>标签将上传文件的最大尺寸设为2M,maxFileSize属性值的单位可以是M,也可以是K或G,如2K,5G等。
启动Tomcat后,在IE中输入如下的URL来测试程序:
http://localhost:8080/samples/uploadFile.jsp