




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、开始Struts 2 第七章 struts2的上传下载序 文件上传是Web应用经常需要面对的问题,在大部分时候,用户的请求参数是在表单域输入的字符串,但如果为表单元素设置enctype="multipart/form-data”属性,则提交表单时不再以字符串方式提交请求参数,而是以二进制编码的方式提交请求,此时直接通过HttpServletRequest的getParamete:方法无法正常获取请求参数的值,我们可以通过二进制流来获取请求内容通过这种方式,就可以取得希望上传文件的内容,从而实现文件的上传。推荐精选 Struts 2 未提供自己的请求解析器,也就是说,Struts 2不
2、会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts 2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。 在Struts 2的perties配置文件中,我们看到了下面的配置代码,它们主要用于配置Struts 2上传文件时的卜传解析器。 #指定使用cos的文件上传解析器 # struts.multipart .parser=cos #指定使用Pell的文件上传解析器 #struts.multipart.parser=pell #Struts 2默认使用Jakarta的Common-
3、FileUpload的文件上传解析器 struts.multpart .parser=jakartaStruts 2默认使用的是Jakarta的Common-FileUpload的文件上传框架,要使用Struts 2的文件上传功能,则需要在Web应用中增加两个commons-io-1.3. l .ja:和commons-fileupload-1.2. jar文件上传例子:上传页面uload.jsp<form action="Upload.action" method="post" enctype="multipart/form-data&
4、quot;> 文件描述:<input type="text" name="fileDesc" /><br> <input type="file" name="file" /><br> <input type="submit" value="上传" /><br> </form>上传的actionprivate String fileDesc;/和前台的是同一个private File fi
5、le;/这是IO的File,回顾下strust1.x的FormFile/这两个字段是被注入进来的,前台页面并没有这两个表单域private String fileFileName;private String fileContentType;/* * 获得保存的路径 */private String getSaveDir()return ServletActionContext.getServletContext().getRealPath("/userDatas");Overridepublic String execute() throws Exception Syst
6、em.out.println("#"+file.getName();System.out.println(""+fileFileName);System.out.println("#"+fileDesc);System.out.println("#"+fileContentType);File targetFile =new File(getSaveDir()+"/"+fileFileName);file.renameTo(targetFile);return "uploadOK&qu
7、ot;推荐精选配置文件:struts.xml<package name="com.huaxia.struts2.action" extends="struts-default"> <action name="Upload" class="com.huaxia.struts2.action.Upload"> <result name="uploadOK">/uploadOK.jsp</result> </action></packa
8、ge> 值得注意的是,上面的Action还包含了两个属性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。这两个属性,体现了Struts 2设计的灵巧、简化之处,Action类直接通过File类型属性直接封装了上传文件的文件内容,但这个File属性无法获取上传文件的文件名和文件类型,所以Struts 2直接将文件域中包含的上传文件名和文件类型的信息封装到fileFileName和fileContentType属性中。可以认为:如果表单中包含一个name属性为xxx的文件域,则对应Action需要使用3个属性来封
9、装该文件域的信息:n .类型为File的xxx属性封装了该文件域对应的文件内容。这是临时文件,在action调用execute后临时文件会被删除n ·类型为String的xxxFileName属性封装了该文件域对应的文件的文件名。n ·类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型。如果要搞清楚struts的上传机制,我们可以打开strust中fileupload拦截器的源代码上传的其他处理:1. 限制文件的大小2. 限制文件的上传类型3. 上传临时目录的设定限制文件的大小在struts2的默认大小是2M,我们可以打开struts.p
10、roperites,查看相关设置,然后在struts.xml将相关设置覆盖掉:# Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data# struts.multipart.parser=cos# struts.multipart.parser=pellstruts.multipart.parser=jakarta# uses javax.servlet.context.tempdir by defaultstruts.multipart.saveDir=struts.multip
11、art.maxSize=2097152覆盖后:<struts><constant name="struts.multipart.saveDir" value="/upTemp" /><constant name="struts.multipart.maxSize" value="4194304" /><package name="com.huaxia.struts2.action" extends="struts-default"&g
12、t; <action name="Upload" class="com.huaxia.struts2.action.Upload"> <result name="uploadOK">/uploadOK.jsp</result> </action></package></struts> 推荐精选这里要强调的是,我们虽然设置了文件的临时目录,而且struts2在上传动作完毕后会自动执行删除,但这个自动删除不一定每次都能删除成功的,所以struts2设定了一个filte
13、r,用来每隔一段时间检测临时目录,如果有文件则去删除,filter的配置如下<!- 配置Struts2的C1eanUp的Filter -><filter><filter-name>struts-cleanup</filter-name><filter-class>org.apache struts2.dispatcher.ActionContextCleanUp</filter-class></filter><!- 定义Struts2的C1eanUp Filter拦截的URL-><filter
14、-mapping><filter-name>struts-cleanup</filter-name><url-pattern>/*</url-pattern></filter-mapping>限制文件的类型在查看fileupload的拦截器源代码时,我们发现如下两个属性:1. allowedTypes2. maximumSize从字面猜测就是允许的上传类型和允许的上传大小,我们可以覆盖掉这两个的配置:<package name="com.huaxia.struts2.action" extends=&q
15、uot;struts-default"> <action name="Upload" class="com.huaxia.struts2.action.Upload"> <interceptor-ref name="fileUpload" > <!- 这里是可以上传文件的扩展名 -> <param name="allowedExtensions">jpg,gif,png</param> <!- 这里是memi类型,在tomcat的配置
16、文件下可以找到很全的memi类型 -> <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg ,image/x-png,image/pjpeg </param> <param name="maximumSize">4194304</param> </interceptor-ref> <interceptor-ref name="defaultStack" />
17、; <result name="uploadOK">/uploadOK.jsp</result> <result name="input">/upload.jsp</result> </action></package>注意如果我们设置了拦截器,就要将默认的拦截器栈也加上,在拦截器章节讲过错误信息显示:当上传文件出现错误时,我们设定了“input”为上传页面,即出现错误的话,回到上传页面,我们在上传页面稍作修改,添加如下代码:<s:fielderror />我们上传一个错
18、误类型的文件,发现:推荐精选如果要自定义消息内容的话:我们就要加入消息资源文件了,首先在struts.xml中加入:<constant name="struts.custom.i18n.resources" value="Resource" />然后,在src下添加Rperties资源文件,输入以下消息:struts.messages.error.file.too.large=The File 1 is too large :3 bstruts.messages.error.content.type.not.allowe
19、d=The File :1 is not supportedstruts.messages.error.file.extension.not.allowed=The File : 1 s extension is not supported关于key的来源和占位符的替代值可以参看fileupload拦截器的源代码的acceptFile方法同时上传多个文件:同时上传多个文件和上传单个文件的过程是一模一样的,只不过要满足以下条件:1. 前台可以将多个文件域的name属性设置成一样2. 在action中用数组或List来接收前台的File3. 循环数组或list,对每个File对象进行操作文件的下载
20、:Struts下载主要是配置好一个result,这个result的类型是“stream”类型的,可去struts-default.xml查找相应的源代码:这里只贴出下载的代码和配置:Action/告诉浏览器数据是以下载的形式接收推荐精选private String contentType="application/x-msdownload"/告诉浏览器数据将要下载的文件的文件名private String contentDisposition="attachment;filename="/设置服务器读取文件的缓冲区大小private String bufferSize="2048"/前台提交过来需要下载的文件的文件名、路径private String fnamepath;Overridepublic String execute() throws Exception File temp = new File(fnamepath);this.contentDisposition+=temp.getName();return "down" /* * 此方法将文件多对应的读取流拿到,getFile是和配置文件中inputName对应的 */public InputStrea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025标准网签版建筑工程合同模板
- 2025企业租赁合同协议标准版
- 2025年降酶退黄类药物合作协议书
- 2025技术转让合同范本(中英文对照)
- 2025年磐安县农产品收购合同
- 2025个人住宅庭院景观规划合同
- 2025二级建造师建筑实务知识点:合同价款约定详解
- 2025私营企业员工试用期合同模板
- 2025年外贸合同法律风险评估
- 2025年叔丁基苯酚项目合作计划书
- 软件质量证明书
- 高考标准化考场建设方案详细
- 人民医院肿瘤科临床技术操作规范2023版
- 高压-引风机电机检修文件包
- 2023届物理高考二模考前指导
- GB/T 39486-2020化学试剂电感耦合等离子体质谱分析方法通则
- GB/T 11085-1989散装液态石油产品损耗
- GXH-3011A1便携式红外线CO分析仪
- NYT 393-绿色食品 农药使用准则
- 2022年四川省阿坝州中考数学试卷及解析
- 综采工作面末采安全技术措施
评论
0/150
提交评论