在Web程序中的上传文件的功能一般会使用<input type=file……/>标签在客户端显示输入要上传的文件名的用户接口如果读者使用过JSP/Servlet来处理客户端上传的文件就会知道实现这个功能并不是很容易而在Struts中为我们提供了一种机制可以非常方便地将客户端上传的文件保存在服务端
在Struts Html标签库中提供了一个<htmlfile>标签可以和FormFile类型的属性一起使用通过这个属性返回的FormFile对象就可以很方便地获得上传文件的InputStream对象并做进一步地处理
在Struts中一个FormFile对象代表一个上传的文件FormFile实际上是一个接口我们可以在orgapachestrutsupload包中找到这个接口FormFile接口有如下五个常用的方法
getInputStream()方法
这个方法用于获得上传文件的javaioInputStream对象我们可以从这个InputStream对象中读取上传文件的数据并将其写到服务端指定的路径下
getFileData()方法
这个方法用于将上传文件的整个内容放到一个byte类型的数组中如果上传文件的尺寸比较小的话使用这个方法可以很方便地将上传文件保存到在服务端的指定路径中
getFileName()方法
这个方法用于获得上传文件的文件名(不包括文件在客户机的路径部分)
getFileSize()方法
这个方法用于获得上传文件的字节数
destroy()方法
用于销毁所有和当前上传文件相关的资源
下面的例子演示了如何使用<htmlfile>标签和FormFile对象来上传单个文件实现这个例子需要如下六步
【第步】建立上传文件的JSP页面
在<samples工程目录>目录中建立一个uploadFilejsp文件代码如下
<%@pagepageEncoding=GBK%>
<%@tagliburi=htmlprefix=html%>
<html>
<head>
<title>上传单个文件(文件大小不能超过M)</title>
</head>
<body>
<%在<html:form>标签中必须加enctype=multipart/formdata%>
<html:formenctype=multipart/formdataaction=uploadFile>
<html:fileproperty=myFile/><p><%使用<html:file>标签让用户输入上传文件名%>
<html:submitvalue=上传/>
</html:form>
</body>
</html>
【第步】建立ActionForm的子类
在<samples工程目录>srcactionform目录中建立一个UploadFormjava文件代码如下
packageactionform;
importorgapachestrutsaction*;
importorgapachestrutsuploadFormFile;
publicclassUploadFormextendsActionForm
{
privateFormFilemyFile;//这个myFile代表要上传的文件
publicFormFilegetMyFile()
{
returnmyFile;
}
publicvoidsetMyFile(FormFilemyFile)
{
thismyFile=myFile;
}
}
【第步】建立Struts动作类(Action的子类)
在Struts中一般在Struts的动作类中处理上传的文件在<samples工程目录>srcaction目录中建立一个UploadActionjava文件代码如下
packageaction;
importjavaxservlethttp*;
importorgapachestrutsaction*;
importorgapachestrutsuploadFormFile;
importjavaio*;
importactionform*;
publicclassUploadActionextendsAction
{
protectedvoidsaveFile(FormFileformFile)throwsException
{
//从webxml文件中获得指定的上传路径
Stringpath=thisgetServlet()getServletConfig()getInitParameter(uploadPath);
InputStreamin=formFilegetInputStream();//获得上传文件的InputStream
//在服务端指定的上传路径中建立一个空的文件(文件名为getFileName()方法返回的值)
FileOutputStreamfout=newFileOutputStream(path+formFilegetFileName());
bytebuffer[]=newbyte[];
intcount=;
//开始向上传路径中刚建立的文件写入数据每次写k字节
while((count=inread(buffer))>)
{
foutwrite(buffercount);
}
foutclose();
formFiledestroy();//上传成功后销毁当前上传文件的资源
}
publicActionForwardexecute(ActionMappingmappingActionFormform
HttpServletRequestrequestHttpServletResponseresponse)
{
UploadFormuForm=(UploadForm)form;
PrintWriterout=null;
try
{
responsesetCharacterEncoding(GBK);
out=responsegetWriter();
saveFile(uFormgetMyFile());//将上传文件保存到指写的路径(在webxml中配置)
outprintln(上传文件成功);
}
catch(Exceptione)
{
outprintln(egetMessage());
}
returnnull;
}
}
在saveFile方法中首先从webxml的Servlet初始化参数中获得一个用于保存上传文件的路径然后从FormFile对象中获得上传文件的InputStream对象并对这个InputStream对象中的字节进行循环读取并写到新的文件中最后在上传成功后将FormFile对象销毁
【第步】配置strutsconfigxml
在这一步来配置一下在第步和第步分别建立的ActionForm和Action的子类打开strutsconfigxml文件在<formbeans>中加入如下的子标签
<formbeanname=uploadFormtype=actionformUploadForm/>
在<actionmappings>中加入如下的子标签
<actionname=uploadFormpath=/uploadFilescope=requesttype=actionUploadAction/>
【第步】设置用于保存上传文件的路径
打开webxml文件找到一个叫action的Servlet(也就是用于处理Struts动作的Servlet)并在<servlet>中加入如下的子标签(假设保存上传文件的路径为D:upload路径的最后一个字符必须是)
<initparam>
<paramname>uploadPath</paramname>
<paramvalue>D:\upload\</paramvalue>
</initparam>
【第步】限制上传文件的大小
这一步是可选的如果不限制上传文件的大小就意味着可以上传任意大小的文件而一般的应用程序如电子相册网络硬盘都会限制上传文件的最大尺寸
打开strutsconfigxml文件在<strutsconfig>中加入如下的子标签
<controllermaxFileSize=M/>
上面的<controller>标签将上传文件的最大尺寸设为MmaxFileSize属性值的单位可以是M也可以是K或G如KG等
启动Tomcat后在IE中输入如下的URL来测试程序