lelistfile2out.printlnquot成功上传的文件:quot filelist.length0 quot无quot : filelist.toStringprivate void makeUpListStringBuffer resultString fragmentiffragment nullifresult.length 0result.appendquotquotresult.appendfragment在 Windows 资源管理器窗口中将 UploadServlet.java 源文件拖动到 compile.bat 文件的快捷方式上进行编译,修改 Javac 编译程序报告的错误,直到编译成功通过为止。
3修改lttomcat 的安装目录gtwebappsfileuploadWEB-INFclassesweb.xml 文件,在其中注册和映射 UploadServlet 的访问路径,如例程 1-3所示。
例程 1-3 web.xmlltweb-appgtltservletgtltservlet-namegtUploadServletlt/servlet-namegtltservlet-classgtUploadServletlt/servlet-classgtlt/servletgtltservlet-mappinggtltservlet-namegtUploadServletlt/servlet-namegtlturl-patterngt/servlet/UploadServletlt/url-patterngtlt/servlet-mappinggtlt/web-appgt4重新启动 Tomcat,并在浏览器地址栏中输入如下地址:http://localhost:8080/fileupload/FileUpload.html填写返回页面中的 FORM 表单,如图 1.4 所示,单击“上载”按钮后,浏览器返回的页面信息如图 1.5 所示。
图 1.4图 1.5(这些图的标题栏中的 it315 改为 fileupload)查看lttomcat 安装目录gtwebappsit315upload 目录,可以看到刚才上传的两个文件。
4单击浏览器工具栏上的“后退”按钮回到表单填写页面,只在第二个文件字段中选择一个文件,单击“上载”按钮,浏览器返回的显示结果如图 1.6 所示。
图 1.6M 脚下留心:上面编写的 Servlet 程序将上传的文件保存在了当前 WEB 应用程序下面的 upload 目录中,这个目录是客户端浏览器可以访问到的目录。
如果用户通过浏览器上传了一个名称为 test.
jsp 的文件,那么用户接着就可以在浏览器中访问这个test.
jsp 文件了,对于本地浏览器来说,这个
jsp 文件的访问 URL 地址如下所示:http://localhost:8080/fileupload/upload/test.
jsp对于远程客户端浏览器而言,只需要将上面的 url 地址中的 localhost 改写为 Tomcat 服务器的主机名或 IP 地址即可。
用户可以通过上面的 Servlet程序来上传自己编写的
jsp 文件,然后又可以通过浏览器来访问这个
jsp 文件,如果用户在
jsp 文件中编写一些有害的程序代码,例如,查看服务器上的所有目录结构,调用服务器上的操作系统进程等等,这将是一个非常致命的安全漏洞和隐患,这台服务器对外就没有任何安全性可言了。
1.3 Apache 文件上传组件的
源码赏析经常阅读一些知名的开源项目的源代码,可以帮助我们开阔眼界和快速提高编程能力。
Apache 文件上传组件是 Apache 组织开发的一个开源项目,从网址 http://jakarta.apache.org/commons/fileupload 可以下载到 Apache 组件的源程序包,在本书的附带带光盘中也提供了该组件的源程序包,文件名为 commons-fileupload-1.0-src.zip。
该组件的设计思想和程序编码细节包含有许多值得借鉴的技巧,为了便于有兴趣的读者学习和研究该组件的
源码,本节将分析 Apache 文件上传组件的源代码实现。
对于只想了解如何使用 Apache 文件上传组件来上传文件的读者来说,不必学习本节的内容。
在学习本节内容之前,读者需要仔细学习了笔者编著的《深入体验 java Web 开发内幕——核心基础》一书中的第 6.7.2 节中讲解的“分析文件上传的请求消息结构”的知识。
1.3.1 Apache 文件上传组的类工作关系Apache 文件上传组件总共由两个接口,十二个类组成。
在 Apache 文件上传组件的十二个类中,有两个抽象类,四个的异常类,六个主要类,其中 FileUpLoad 类用暂时没有应用,是为了以后扩展而保留的。
Apache 文件上传组件中的各个类的关系如图 1.7 所示,图中省略了异常类。
图 1.7DiskFileUpload 类是文件上传组件的核心类,它是一个总的控制类,首先由 Apache 文件上传组件的使用者直接调用 DiskFileUpload 类的方法,DiskFileUpload 类再调用和协调更底层的类来完成具体的功能。
解析类 MultipartStream和工厂类 DefaultFileItemFactory 就是 DiskFileUpload类调用的两个的底层类。
MultipartStream 类用于对请求消息中的实体数据进行具体解析,DefaultFileItemFactory 类对 MultipartStream 类解析出来的数据进行封装,它将每个表单字段数据封装成一个个的 FileItem 类对象,用户通过 FileItem 类对象来获得相关表单字段的数据。
DefaultFileItem 是 FileItem 接口的实现类,实现了 FileItem 接口中定义的功能,用户只需关心 FileItem 接口,通过 FileItem 接口来使用DefaultFileItem 类实现的功能。
DefaultFileItem 类使用了两个成员变量来分别存储表单字段数据的描述头和主体内容,其中保存主体内容的变量类型为 DeferredFileOutputStream 类。
DeferredFileOutputStream 类是一个输出流类型,在开始时,DeferredFileOutputStream 类内部使用一个 ByteArrayOutputStream 类对象来存储数据,当写入它里面的主体内容的大小大于 DiskFileUpload.setSizeThreshold 方法设置的临界值时,DeferredFileOutputStream 类内部创建一个文件输出流对象来存储数据,并将前面写入到 ByteArrayOutputStream 类对象中的数据转移到文件输出流对象中。
这个文件输出流对象关联的文件是一个临时文件,它的保存路径由 DiskFileUpload.setRepositoryPath 方法指定。
Apache 文件上传组件的处理流程如图 1.8 所示。
图 1.8图 1.8 中的每一步骤的详细解释如下:(1)Web 容器接收用户的 HTTP 请求消息,创建 request 请求对象。
(2)调用 Disk.
上一篇:
数据库精品课程网站
下一篇:
致享和威驰哪个好点?冲着安全和空间 推荐致享