struts2上传原理和实例Word文件下载.docx
- 文档编号:16998546
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:12
- 大小:21.90KB
struts2上传原理和实例Word文件下载.docx
《struts2上传原理和实例Word文件下载.docx》由会员分享,可在线阅读,更多相关《struts2上传原理和实例Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
<
%@pagelanguage="
java"
contentType="
text/html;
charset=UTF-8"
%>
html>
head>
<
title>
Struts2FileUpload<
/title>
/head>
body>
formaction="
fileUpload.action"
method="
POST"
enctype="
multipart/form-data"
>
文件标题:
inputtype="
text"
name="
title"
size="
50"
/>
br/>
选择文件:
file"
upload"
submit"
value="
上传"
/form>
/body>
/html>
此页面特殊之处只是把表单的enctype属性设置为multipart/form-data。
2.2.
步骤二:
创建处理上传请求的Action类
packageorg.qiujy.web.struts2;
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importorg.apache.struts2.ServletActionContext;
importcom.opensymphony.xwork2.ActionSupport;
/**
*处理文件上传的Action类
*@authorqiujy
*@version1.0
*/
publicclassFileUploadActionextendsActionSupport{
privatestaticfinalintBUFFER_SIZE=16*1024;
//文件标题
privateStringtitle;
//上传文件域对象
privateFileupload;
//上传文件名
privateStringuploadFileName;
//上传文件类型
privateStringuploadContentType;
//保存文件的目录路径(通过依赖注入)
privateStringsavePath;
//以下省略getter和setter......
//自己封装的一个把源文件对象复制成目标文件对象
privatestaticvoidcopy(Filesrc,Filedst){
InputStreamin=null;
OutputStreamout=null;
try{
in=newBufferedInputStream(newFileInputStream(src),BUFFER_SIZE);
out=newBufferedOutputStream(newFileOutputStream(dst),
BUFFER_SIZE);
byte[]buffer=newbyte[BUFFER_SIZE];
intlen=0;
while((len=in.read(buffer))>
0){
out.write(buffer,0,len);
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(null!
=in){
in.close();
}catch(IOExceptione){
=out){
out.close();
@Override
publicStringexecute()throwsException{
//根据服务器的文件保存地址和原文件名创建目录文件全路径
StringdstPath=ServletActionContext.getServletContext()
.getRealPath(this.getSavePath())
+"
\\"
+this.getUploadFileName();
System.out.println("
上传的文件的类型:
"
+this.getUploadContentType());
FiledstFile=newFile(dstPath);
copy(this.upload,dstFile);
returnSUCCESS;
}
上面这个Action类中,提供了title和upload两个属性来分别对应页面的两个表单域属性,用来封装表单域的请求参数。
但是,值得注意的是,此Action中还有两个属性:
uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名、文件类型。
这是Struts2设计的独到之处:
Strut2的Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts2就直接将文件域中包含的上传文件名和文件类型的信息封装到uploadFileName和uploadContentType属性中,也就是说Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
l
类型为File的xxx属性:
用来封装页面文件域对应的文件内容。
类型为String的xxxFileName属性:
用来封装该文件域对应的文件的文件名。
类型为String的xxxContentType属性:
用来封装该文件域应用的文件的文件类型。
另外,在这个Action类中还有一个savePath属性,它的值是通过配置文件来动态设置的,这也是Strut2设计中的一个依赖注入特性的使用。
2.3.
步骤三:
配置
struts.xml文件:
!
DOCTYPEstrutsPUBLIC
"
-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
http:
//struts.apache.org/dtds/struts-2.0.dtd"
struts>
packagename="
fileUploadDemo"
extends="
struts-default"
actionname="
fileUpload"
class="
org.qiujy.web.struts2.FileUploadAction"
--动态设置Action中的savePath属性的值-->
paramname="
savePath"
/upload<
/param>
resultname="
success"
/showupload.jsp<
/result>
/action>
/package>
/struts>
在这个文件中跟以前配置唯一不同的是给action配置了一个<
param…/>
元素,用来为该Action的savePath属性动态注入值。
web.xml中的配置跟以前的应用一样。
说明一点:
好多网络文章说Struts2上传时要在web.xml中配置一个名为ActionContextUp的过滤器,说是有一些莫名的错误,可是是我用了Struts2新版本2.0.9GA版,测了n次,没出现什么问题,所以没配置。
2.4.
运行调试:
运行前要在根目录下创建一个名为upload的文件夹,用来存放上传后的文件。
上传结果:
3.
文件类型及错误输出:
Struts2提供了一个文件上传的拦截器(名为fileUpload),通过配置这个拦截器能轻松地实现文件类型的过滤。
在上例中,若要配置上传的文件只能是一些普通的图片文件格式:
image/bmp、image/png、image/gif、image/jpeg、image/jpg等,则可在struts.xml文件中按如下方式配置:
constantname="
struts.custom.i18n.resources"
messages"
packagename="
extends="
actionname="
class="
interceptor-refname="
--配置允许上传的文件类型,多个用"
"
分隔-->
allowedTypes"
image/bmp,image/png,image/gif,image/jpeg,image/jpg
image/x-png,image/pjpeg
--配置允许上传的文件大小,单位字节-->
maximumSize"
102400<
/interceptor-ref>
defaultStack"
/>
resultname="
input"
/index.jsp<
/action>
/package>
如果上传文件失败,系统返回到input对应的页面,要在input对应的页面输出文件过滤失败信息,可以在input对应的页面中增加<
s:
fielderror/>
来显示错误信息。
运行调试:
结果:
显然,这样的提示不太友好,应用使用国际化信息。
在国际化资源文件中添加如下三句:
#更改上传文件类型不允许的提示信息
struts.messages.error.content.type.not.allowed=文件上传失败:
你要上传的文件类型不允许
#更改上传文件太大的提示信息
struts.messages.error.file.too.large=文件上传失败:
你要上传的文件太大
#文件上传其它错误信息
struts.messages.error.uploading=文件上传失败:
发生内部错误
别忘了要用native2ascii.exe进行编码转换哦。
再运行调试:
另外,在控制台会看到一条消息:
Unabletofind'
struts.multipart.saveDir'
propertysetting.Defaultingtojavax.servlet.context.tempdir
RemovingfileuploadD:
\tomcat6.0.13\work\Catalina\localhost\fileload_struts2\upload__4b616fd1_115a3d5d9dc__7fff_00000005.tmp
第一个说是找不以struts.multipart.saveDir,即没有指定临时文件夹,这个很好解决,只需指定一个struts.multipart.saveDir常量值为某个目录来解决。
第二个说正在删除一个临时文件,这个临时文件是上传过程中产生的,属正常。
4.
多文件上传:
Struts2也可以很方便地实现多文件上传。
在输入表单域增加多个文件域:
multifileupload.jsp
%@tagliburi="
/struts-tags"
prefix="
s"
%>
多文件上传<
fontcolor="
red"
/font>
multiFileUpload.action"
${param.title}"
--设置二个文件域,名字相同-->
选择第一个文件:
选择第二个文件:
在Action类中用数组来封装该多个文件域:
MultiFileUploadAction.java
importjava.io.IOException;
*处理多文件上传的Action类
*
publicclassMultiFileUploadActionextendsActionSupport{
//用File数组来封装多个上传文件域对象
privateFile[]upload;
//用String数组来封装多个上传文件名
privateString[]uploadFileName;
//用String数组来封装多个上传文件类型
privateString[]uploadContentType;
//以下为所有属性的getter和setter。
省略。
。
//自己封装的一个把源文件对象复制成目标文件对象
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts2 上传 原理 实例