版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章文件上传和下载文件的上传和下载是Web应用中常用的功能。一般情况下可以通过二进制编码的方式来获得请求参数的值,从而通过二进制流来获得上传文件内容。这种手动编程方式比较麻烦,需要手动地控制二进制流,相当的复杂。不过可以使用其他开源组织提供的上传项目,通过这些项目可以非常简单的完成文件上传。7.1使用上传框架实现文件上传7.1.1上传框架介绍
7.1.2下载并安装Common-FileUpload框架
7.1.3通过Common-FileUpload框架实现文件上传
7.1.4测试文件上传
7.1.5上传多个文件7.1.6测试上传多个文件7.1.7下载并安装COS框架7.1.8通过COS框架实现文件上传7.1.9测试使用COS框架实现文件上传7.1.1上传框架介绍文件上传和下载,是一个Web开发应用中常用的功能。在开发中会经常需要实现文件的上传和下载。可以通过获得HTTP请求的输入流,然后通过输出流将数据保存到文件中。不过遇到了很多问题,比如说要实现非文本文件的上传,需要通过自己编写代码来实现是非常困难的事情。有时候可以不必自己去造轮子,而是使用别人造好的轮子。为什么选择使用Struts2框架呢,也就是因为通过它来构建Web应用会变得更加简单、方便。同样可以使用一些开源的上传框架来实现文件上传,这样可以很轻松地完成应用的需求。不过其底层的实现机制也要花一点时间去了解。虽然不要去手动实现该框架,但是要能够对该框架实现原理有所掌握。下面来看看目前有哪些优秀的上传框架。目前比较流行的有Common-FileUpload框架、COS框架,这两个框架都出生豪门,其上传功能实现得非常好。而且代码封装得特别好,开发人员只需创建几个对象并调用其方法就能实现文件上传。7.1.2下载并安装Common-FileUpload框架首先还是要去下载Common-FileUpload框架。Common-FileUpload框架是Apache开源组织下的一个项目。登录Apache的官方站点并找到jakarta项目下的Commons项目,单击此链接进入Commons项目首页,如图7-1所示。7.1.3通过Common-FileUpload框架实现文件上传现在来看如何通过Common-FileUpload框架实现文件上传。7.1.4测试文件上传现在来测试是否能真正地完成文件上传。首先打开用户输入页,如图7-4所示。,用户名就填写用户自己的名字吧,上传文件选择一个文件比较小点的文件,单击“上传”按钮进行上传。页面跳转到结果输出页。页面中显示了用户名以及上传的文件名,如图7-5所示。7.1.5上传多个文件下面来看如何同时上传多个文件。在Servlet中使用了循环遍历所有的表单域,所以只要在用户输入页中增加文件域就可以了,修改代码如下所示。7.1.6测试上传多个文件打开用户输入页,填写用户名并选择两个文件进行上传,如图7-9所示。页面跳转到结果输出页。页面中显示了用户名以及上传的文件名,如图7-10所示。7.1.7下载并安装COS框架下面来看另一个上传框架,COS框架。COS框架是oreilly组织下的一个小项目。要获得它首先要登录其官方站点“”,单击右侧导航栏中的“com.oreilly.servlet”链接进入COS项目首页,如图7-13所示。从项目首页中看到目前COS的最新版本为05Nov2002,单击其下载链接进行下载。下载完成后,得到一个名为cos-05Nov2002.zip的压缩文件包,如图7-14所示。7.1.8通过COS框架实现文件上传现在来看如何通过COS框架来实现文件上传。首先将用户输入页和结果页稍微做些修改,将如下代码:<h1>通过Common-FileUpload框架完成上传</h1>替换成:<h1>通过COS框架完成上传</h1>COS框架的核心类为MultipartParser,这个类负责解析HTTP请求,同时还可以用来设置上传文件的最大值。可以通过MultipartParser的readNextPart()方法来获得所有的表单域。COS使用Part实例来表示所有的表单域,也就是说不管是普通表单域还是文件域,其类型都是Part。可以调用Part实例的isParam()方法来判断该表单域是不是普通表单域,同样也可以调用其isFile()来判断该表单域是不是文件域。7.1.9测试使用COS框架实现文件上传打开用户输入页,填写用户名并选择两个文件进行上传,如图7-15所示。页面跳转到结果输出页。页面中显示了用户名以及上传的文件名,如图7-16所示。7.2基于Struts2完成文件上传前面介绍了如何通过Common-FileUpload框架和COS框架实现了文件上传。Struts2并没有提供上传组件,而是通过调用这些上传框架来实现的上传。Struts2对于这些上传框架进行了进一步封装,从而更加简化了文件上传。7.2.1配置上传解析器前面分别通过Common-FileUpload框架和COS框架实现了文件上传,下面来看如何基于Struts2来完成文件上传。前面提到过Struts2并没有提供上传组件,而是通过调用这些上传框架来实现的上传,那么如何在Struts2中配置这些上传框架呢?首先打开导入struts2-core-.jar库文件,找到org.apache.struts2包下的perties资源文件,代码如下所示。在该资源文件中给出了许多的Struts2的默认配置,其中可以看到Struts2默认使用jakarta作为其文件上传的解析器,代码如下所示。###ParsertohandleHTTPPOSTrequests,encodedusingtheMIME-typemultipart/form-data#struts.multipart.parser=cos#struts.multipart.parser=pellstruts.multipart.parser=jakarta7.2.2实现文件上传Action下面就来看如何基于Struts2完成单个文件上传。首先创建用户输入页,该页面仅仅包含一个表单,用来输入用户名以及选择用来上传的文件,表单提交到upload.action,代码如下所示。<%@pagelanguage="java"pageEncoding="gb2312"%><html><head><title>文件上传</title></head> <center> <h1>Struts2完成上传</h1><formaction="upload.action"method="post"enctype="multipart/form-data"> <table> <tr> <td>用户名:</td> <td><inputtype="text"name="username"></td> </tr> <tr> <td>上传文件:</td> <td><inputtype="file"name="myFile"></td> </tr> <tr> <td><inputtype="submit"value="上传"></td> <td><inputtype="reset"></td> </tr> </table></form></center><body></body></html>7.2.3配置文件上传Action在struts.xml文件中配置文件上传Action。定义upload的Action,指定其实现类为net.hncu.struts2.action.UploadAction。为了能够接受中文参数值,设置参数编码为gb2312,代码如下所示。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""/dtds/struts-2.0.dtd"><!--struts为配置文件根元素--><struts><!--设置参数编码--><constantname="struts.i18n.encoding"value="gb2312"></constant><!--Action必须放在指定的包名空间中--><packagename="struts2"extends="struts-default"><!--定义upload的Action,其实现类为net.hncu.struts2.action.UploadAction--><actionname="upload"class="net.hncu.struts2.action.UploadAction"><!--定义处理结果与视图资源之间的关系--><resultname="success">/result.jsp</result><resultname="input">/upload.jsp</result></action></package></struts>7.2.4测试文件上传打开用户输入页,填写用户名并选择文件进行上传,如图7-19所示。页面跳转到结果输出页。页面中显示了用户名以及上传的文件名,如图7-20所示。7.3文件上传高级配置前面介绍了如何基于Struts2完成文件上传,Struts2还提供了文件上传的高级配置从而实现文件保存目录的配置、文件过滤以及输出错误提示等。7.3.1配置文件保存目录Struts2提供了文件上传的高级配置用来实现保存目录的配置。首先在Action中添加savePath属性,该属性用来封装上传文件保存目录,为该属性添加setter和getter方法,代码如下所示。7.3.2实现文件过滤Struts2提供了文件上传的高级配置用来实现文件的过滤。要实现文件过滤,只需配置文件上传拦截器的属性。文件上传拦截器中有如下两个属性。protectedLongmaximumSize;protectedStringallowedTypes;maximumSize:该属性用来指定上传文件大小的最大值,单位为字节(Byte)。allowedTypes:该属性用来指定允许上传的文件类型。下面在struts.xml文件中配置该文件上传拦截器,指定上传文件大小的最大值为50KB,指定上传文件的类型为BMP或者JPG。7.3.3输出错误提示现在限制了文件上传的类型以及大小,那么如果用户提交不符合要求文件应该给出错误信息提示。很幸运,Struts2的文件上传拦截器FileUploadInterceptor帮助做到了这一点。FileUploadInterceptor拦截器将错误信息保存到fileldError中,FileUploadInterceptor拦截器代码如下所示。7.4Struts2实现上传多个文件前面介绍的都是上传一个文件,其实Struts2也可以很方便地实现多文件上传。如果页面中有多个文件域需要实现文件上传,则只需在Action为每个文件域指定三个属性分别用来封装上传文件、上传文件类型、上传文件名。7.4.1使用数组实现上传多个文件前面介绍的都是上传单个文件,下面来看如何实现上传多个文件。可以选择在Action为每个文件域指定三个属性分别用来封装上传文件、上传文件类型、上传文件名。这样确实可以实现多个文件的上传,但是这样使得代码过于臃肿,而且失去了灵活性。如果以后要添加一个文件域,那就必须在Actionh中为其添加相应的属性。这时可以使用数组或者List来封装所有的文件域,不过前提是这些文本域的name属性必须相同。下面新建一个用户输入页,添加两个文件域,其name属性都为myFile。7.4.2测试使用数组实现上传多个文件打开用户输入页,填写用户名并选择文件进行上传,如图7-26所示。页面跳转到结果输出页。页面中显示了用户名以及上传的文件名,如图7-27所示。7.4.3使用List实现上传多个文件这里还可以使用List来处理多个文件的上传,这种方式和使用数组基本类似。只需要将使用数组类型封装文件域中的数组类型替换成List类型就可以了。7.5文件下载通过Struts2的文件下载支持可以轻松地完成文件下载,而且还可以实现中文文件名下载。通过Struts2文件下载支持与拦截器相结合可以实现文件的下载权限控制。7.5.1使用Struts2配置文件下载前面介绍的都是文件上传的知识,下面来看如何实现文件下载。有朋友肯定会问提出,实现文件下载很简单啊!只要给出该文件的超链接不就行了吗?那下面就按照这样的方法,使用超链接来实现文件下载。首先在Web项目根目录下添加一个文件夹dowload,在该文件夹下放置一个压缩文件1.zip。编写下载页面dowload.jsp,添加该文件的下载链接,代码如下所示。<%@pagelanguage="java"pageEncoding="gb2312"%><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>文件下载</title></head> <center> <h1>文件下载</h1> <ahref="download/1.zip">链接方式下载</a></center><body></body></html>7.5.2实现文件下载Action新建文件下载Action,该Action与以前创建的Action没有太大的不同。不过如果要实现文件下载,必须为该Action提供一个返回InputStream流的方法,代码如下所示。packagenet.hncu.struts2.action;importjava.io.InputStream;importorg.apache.struts2.ServletActionContext;importcom.opensymphony.xwork2.ActionSupport;publicclassDownloadActionextendsActionSupport{//该方法返回需要被下载文件的输入流publicInputStreamgetDownload(){returnServletActionContext.getServletContext().getResourceAsStream("/download/复件1.zip");}publicStringexecute()throwsException{returnSUCCESS;}}这里使用ServletContext的getResourceAsStream()返回被下载文件的输入流。7.5.3配置该文件下载Action下面需要对文件下载Action进行配置,这里与前面不同的是需要配置该Action一个类型为stream的结果。可以通过struts-default.xml文件查看stream结果的配置,代码如下所示。<result-types>。。。<result-typename="stream"class="org.apache.struts2.dispatcher.StreamResult"/>。。。</result-types>从stream结果的配置可以看出,其对应的实现类为StreamResult,代码如下所示。publicclassStreamResultextendsStrutsResultSupport{。。。protectedStringcontentType="text/plain";protectedStringconten
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗机构财务审计制度探讨
- 2024年度太阳能产品购销合同
- 企业疫情期间员工隔离管理制度
- 新能源项目110kV设备调试方案
- 工业园区防雷系统实施合同
- 2024年度数据共享保密合同
- 2024年度融资租赁合同标的详细
- 2024年度校园网络综合布线设计与施工合同
- 高校科技文化节活动方案
- 2024年度商标许可合同使用范围
- 【桌面推演】应急演练、桌面推演
- Q∕SY 02625.1-2018 油气水井带压作业技术规范 第1部分:设计
- SAJ三晶变频器S350系列说明书
- (完整版)ECRS培训课件
- 湘少版英语三下《Unit6Whatcolouristhisballoon》PPT课件2[wwwedudownnet]
- 【课件】甜甜的滋味双页
- 造林施工组织设计
- 危大工程和超危大工程范围图例
- 国际消费者研究(共85页).ppt
- 三年级作文——观察桔子-PPT课件(共24张)
- 增值税发票税控系统专用设备注销发行登记表
评论
0/150
提交评论