JavaWeb之实现文件上传与下载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb之实现文件上传与下载相关的知识,希望对你有一定的参考价值。

1、什么是上传和下载?

-  数据上传是指客户端向服务器上传数据,客户端向服务器发送的所有请求都属于数据上传。文件上传是数据上传的一种特例,指的是客户端向服务器上传文件。即将保存在客户端的文件上传至服务器中的一个副本,保存到服务器中。

-   数据下载是指客户端从服务器上获取数据的过程。文件下载是数据下载的一种特例,指的是客户端从服务器下载文件,即将原来保存在服务器中的文件下载到客户端中一个副本保存。通常我们对服务器所发出的请求,大多数是文件下载请求,从服务器中下载文本、图片、声音、视频等文件,然后由客户端浏览器对这些文件进行解析后,才可能看到这些多媒体信息。

-  但是我们这里所说的文件下载,指的是文件从服务器下载到浏览器后,浏览器并不直接解析,而是以附件的形式保存到客户端中。

-  上传与下载的文件可以是文本文件、图片、声音、视频等各种类型。

技术分享

2、文件上传的实现:

a、上传时对表单的要求:

-  文件上传要求客户端表单提交特殊的请求--multipart请求,即包含多部分数据的请求。所以文件上传表单对于表单数据的编码类型要求,必须为multipart/form-data。即要为<form>标签指定enctype属性值为“multipart/form-data”。(enctype,即encodingtype,编码类型。)

-  由于客户端上传文件的大小是不确定的,所以HTTP协议规定,文件上传的数据要存放于请求正文中,而不能够出现在url的地址栏中,因为地址栏中可以存放的数据量太小。也就是说,文件上传的表单,必须提交POST请求,而不能够提交GET请求。

技术分享


b、使用第三方工具实现文件上传:

-  需要使用到两个jar包:commons-fileupload-1.3.3.jar和commons-io-2.6.jar,jar包可以在apache官网中下载(commons-fileupload-1.3.3.jar依赖于commons-io-2.6.jar,如果只使用fileupload jar包,会运行程序时会抛出异常)

-  示例代码如下:

-  在index.jsp文件中填写的代码如下所示:

技术分享


- 为web应用添加一个Servlet,在web.xml文件中添加配置信息:

技术分享


-  自定义serlvet类,在doPost方法中编写简单实现文件上传的代码:

技术分享


-  启动web应用,访问index.jsp,添加图片后,点击“上传”,可以发现控制台打印结果,在工作空间web项目的指定目录可以看到图片已经上传:(在Eclipse中,默认会把Web项目放到Eclipse的工作空间下的.metadata\.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下)

技术分享

技术分享

技术分享


-  FileUploadServlet类中的代码相关解释:(也包含使用fileupload jar包文件上传时的常用方法)

-  org.apache.commons.fileupload.disk.DiskFileItemFactory类:默认的FileItemFactory实现类。这个实现创建FileItem实例(文件条目)。如果是小条目,会将其存入内存中,如果是大条目,会将其存入硬盘中的临时文件。大小条目数据的临界值,是可配置的。

技术分享

-  setRepository(File repository)方法:设置临时存储文件(这个文件大小大于指定配置临界值)存放的目录位置。

-  setSizeThreshold(int sizeThreshold)方法:设置临界值(单位为字节),当超过这个值时文件将会直接写入硬盘中。(如sizeThreshold为1024 * 1024,则为1兆)

技术分享



-  org.apache.commons.fileupload.servlet.ServletFileUpload类:处理文件上传的高级API。(如何存储各个部分的数据是由创建它们的工厂决定;给定的部分可能在内存中、磁盘上或者其他地方)

技术分享

-  parseRequest方法:解析请求,获取FileItem类型元素的List对象:

技术分享


-  ServletFileUpload类的父类org.apache.commons.fileupload.FileUploadBase的方法:

-  设置每个item的头部字符编码,其可以解决文件名的中文乱码问题:(若tomcat版本较低时,可能会出现文件名中文乱码)

技术分享

-  setFileSizeMax(long fileSizeMax)方法设置单个上传文件允许上传的最大边界值。

-  setSizeMax(long sizeMax)方法设置一次上传所有文件的总和最大边界值。(单位都为字节)

技术分享

技术分享



-  isMultipartContent(HttpServletRequest request)方法:判断该请求是否包含multipart内容

技术分享


-  org.apache.commons.fileupload.FileItem接口:表示在multipart/form-data的POST请求中内的一个文件或者表单条目。

技术分享

-  isFormField方法:判断FileItem实例是否为一个普通form项:

技术分享

-  getFieldName方法:获取对应文件条目(即单个表单项)的name属性值:

技术分享

-  getName方法:获取客户端文件系统中的原上传文件名:(包含后缀名)

技术分享

-  getInputStream方法:获取输入流,用于取出上传文件中的内容:

技术分享

-  delete方法:删除任何相关联的临时磁盘文件:

技术分享


3、文件下载的实现:

a、超链接下载:将下载资源作为超链接的链接目标文件出现。若浏览器可以解析该资源文件,则将在浏览器上直接显示文件内容;若浏览器不支持该文件的解析,则会弹出另存为对话框,要求用户保存。

-  该下载方式的缺点很明显,不同的浏览器,以及相同的浏览器所安装的插件不同,那么其对于资源的解析能力也就不同,其是否弹出另存为对话框的情况也就不一样。决定权由浏览器掌握。

-  如在jsp文件中添加如下代码,在ff浏览器中点击,直接在浏览器中打开该图片:

技术分享


b、Servlet方式的文件下载:

-  示例代码:

-  jsp文件中的内容和web.xml文件中添加的配置:

技术分享

技术分享


-  自定义Servlet类中添加如下代码:

技术分享

-  如果想要浏览器下载的方式是以附件的形式下载,需要修改响应的头部属性content-disposition值为attachment;filename=文件名 + 后缀名。(filename表示以附件形式下载显示的文件名)

javax.servlet.ServletContext接口的getResourceAsStream方法:获取web应用中的指定路径下的资源,以字节输入流InputStream的形式返回。

技术分享


-  启动web应用,点击超链接后,可以看到文件以附件的形式下载:

技术分享


4、附加说明:

-  上传文件目录的管理:当用户上传的文件过多,而单个目录能够存放的文件个数有限,(windows系统下单文件夹中最大可有65,534个文件)所以需要上传的文件有时需要分目录进行管理。

-   可以使用java.io.File类的mkdir()方法来在当前目录中创建直接子目录,或者使用mkdirs()方法创建当前目录的多层子目录:

技术分享

技术分享


本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1977293

以上是关于JavaWeb之实现文件上传与下载的主要内容,如果未能解决你的问题,请参考以下文章

JAVAWEB之文件的上传和下载

JavaWeb之上传与下载

JavaWeb之文件上传下载

JAVAWEB之文件的上传下载

javaWeb基础之文件上传和下载

JavaWeb实现文件上传下载功能实例解析 (好用)