Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。
对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。
要实现Web开发的上传功能,通常需要完成两步操作:一是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。
上传大多数情况是通过表单的形式提交给服务器,使用<input type="file">标签。
使用<input type="file">标签需要注意以下两点:
1.必须设置name属性,不然浏览器不会发送上传文件的数据。
2.必须将method属性设置为post,ectype属性设置为“multipart/form-data”类型。
由于在Servlet直接读取上传数据,并且解析出相应文件数据是一项非常麻烦的工作。为了方便处理上传数据,Apache组织提供了一个开源组件Commons-FileUpload。该组件可以将“multipart/form-data”类型请求的各种表单域解析出来,并实现一个或多个文件上传,同时也可以限制上传文件的大小等内容。其性能十分优异,使用极其简单。
Fileltem 接口
Fileltem 接口在Commons-FileUpload组件中被实现,其主要用于封装单个表单字段元素的数据,一个表单字段元素对应一个Fileltem对象。Commons-FileUpload组件在处理文件上传的过程中,将每一个表单域(包括普通的文本表单域和文件域)封装在一个Fileltem对象中。
为了便于讲解,在此将Fileltem接口的实现类称为Fileltem类,Fileltem类实现了Serializable接口,因此,支持序列化操作。
(1)boolean isFormField()
(2)String getName()
(3)String getFieldName()
(4) void write(File file)
(5)String getString()
(6)String getContentType()
(7)boolean islnMemory()
(8) void delete()
(9)InputStream getInputStream()
(10)long getSize()
DiskFileltemFactory类
DiskFileltemFactory类用于将请求消息实体中的每一个文件封装成单独的Fileltem对象。如果上传的文件比较小,将直接保存在内存中,如果上传的文件比较大,则会以临时文件的形式,保存在磁盘的临时文件夹中。默认情况下,文件保存在内存还是硬盘临时文件夹的临界值是10240,即10KB。DiskFileltemFactory类中包含两个构造方法。
**DiskFileltemFactory()**采用默认临界值和系统临时文件夹构造文件项工厂对象
**DiskFileltemFactory(int sizeThreshold,Filerepository)**采用参数指定临界值和系统临时文件夹构造文件项工厂对象
ServletFileUpload类
ServletFileUpload 类是 Apache组件处理文件上传的核心高级类,通过使用parseRequest(HttpServletRequest)方法可以将 HTML 中每个表单提交的数据封装成一个Fileltem 对象,然后以List列表的形式返回。ServletFileUpload类中包含两个构造方法。
ServletFileUpload() 构造一个未初始化的ServletFileUpload实例对象
ServletFileUpload(FileltemFactory fileltemFactory) 根据参数指定的 FileltemFactory对象创建一个ServletFileUpload对象
文件下载
DownloadServlet类主要用于设置所要下载的文件以及文件在浏览器中的打开方式。
创建下载目录文件
在WebContent目录下创建名为download的文件夹(folder),并在该文件夹下放一个名称为“1.jpg”的图片文件。
所需要的包:如下图
实现文件上传
创建项目,导包JAR
创建Servlet
UploadServlet类主要用于获取表单及其上传文件的信息。
接着就是看运行结果,这就是运行之后的结果