1.servlet 如何实现文件的上传和下载?

1.1上传文件

  • 通过前台选择文件,然后将资源上传到(即新建一个文件)到发布的资源文件下面,
  • 下载就是url 到发布的资源文件,触发即可自动下载。服务器已经封装了如何下载的底层实现。(此处用的是tomcat)
  • JSP上传文件方法: 关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.

在开始JSP上传文件之前你要准备以下几个东西:

1. commons-FileUpload 1.3 包

下载地址:http://jakarta.apache.org/commons/fileupload/

2. commons-IO 2.5 包

下载地址:http://jakarta.apache.org/commons/io/ 

有了上面这些东西我们就可以开始了

1. 新建一个叫Servlet_UploadDownLoad的WEB项目

2. 接着把这两个jar包放到WEB-INF/lib目录中:


java中文件的上载代码 java实现文件上传和下载_上传

3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,


java中文件的上载代码 java实现文件上传和下载_MVC_02

上面文件中有几个需要注意的地方就是

1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.

2. method="POST" 这里必须为"POST"方式提交不能是"GET".

3. enctype="multipart/form-data" 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.

4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.


接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java


java中文件的上载代码 java实现文件上传和下载_上传文件_03


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_04

upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_05

写好以后再点击"保存"

把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入http://localhost:8080/Servlet_UploadDownLoad/upload.jsp怎么样看到JSP上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有对.

好了,现在我们点击页面上的"浏览"按钮,找到我们要上传的文件,最后点击"Submit",太激动了,还不看一下你的I:\\updir里面有没有你要的东西.

1.2下载文件 

1)通过超链接实现下载

在HTML网页中,通过超接链接到要下载的文件的地址:downloadOne.jsp


java中文件的上载代码 java实现文件上传和下载_MVC_06

"/Servlet_UploadDownLoad/file/commons-beanutils-1.9.3-bin.zip"是文件路径,程序结构如下图:


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_07

 

程序运行后,可以通过单击需要下载文档实现下载


java中文件的上载代码 java实现文件上传和下载_上传_08

但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

 

java中文件的上载代码 java实现文件上传和下载_上传文件_09

java中文件的上载代码 java实现文件上传和下载_上传文件_09

java中文件的上载代码 java实现文件上传和下载_上传文件_09

java中文件的上载代码 java实现文件上传和下载_上传文件_09

java中文件的上载代码 java实现文件上传和下载_上传文件_09

java中文件的上载代码 java实现文件上传和下载_上传文件_09


java中文件的上载代码 java实现文件上传和下载_上传_15

这是因为通过超接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载。

因此利用第二种方法实现下载功能。 

2)通过Servlet程序实现下载

通过Servlet下载文件的原理是通过servlet读取目标程序,将资源返回客户端。

downloadTwo.jsp


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_16

其中,/Servlet_UploadDownLoad 是servlet程序的映射路径

然后新建一个servlet,名称为ServletDownload,URL映射为/ServletDownload


java中文件的上载代码 java实现文件上传和下载_上传文件_17


java中文件的上载代码 java实现文件上传和下载_MVC_18

 

web.xml :


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_19

ServletDownload.java :


java中文件的上载代码 java实现文件上传和下载_MVC_20


java中文件的上载代码 java实现文件上传和下载_上传_21

重启tomcat服务器,即可实现对压缩包和对图片的下载。


2、struts如何实现文件的上传和下载?

2.1struts上传文件

先新建web project ,然后Add Struts Capabilties


java中文件的上载代码 java实现文件上传和下载_MVC_22


java中文件的上载代码 java实现文件上传和下载_上传文件_23


java中文件的上载代码 java实现文件上传和下载_上传_24

struts.xml  的配置:


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_25

upload.jsp :


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_26

<form actinotallow="upload.action" theme="simple" enctype="multipart/form-data" method="post"> 

表单中enctype="multipart/form-data"的意思,是设置表单的MIME 编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;

只有使用了multipart /form-data,才能完整的传递文件数据,进行下面的操作. enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去。

theme="simple"是struts2 的一个最简单的主题,这样你的标签就生成最简单的HTML元素 不会生成额外的内容

<input type="file" name="file" />

【这里的name一定要与action类里面的name名字一致,set/get】

success.jsp


java中文件的上载代码 java实现文件上传和下载_MVC_27

web.xml


java中文件的上载代码 java实现文件上传和下载_MVC_28

UploadAction.java


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_29

 Upload.java


java中文件的上载代码 java实现文件上传和下载_上传_30

mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下:

new File("/tmp/one/two/three").mkdirs();

执行后, 会建立tmp/one/two/three四级目录

new File("/tmp/one/two/three").mkdir();

则不会建立任何目录, 因为找不到/tmp/one/two目录, 结果返回false

例子的代码结构:2.2struts下载文件


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_31

方法一:通过配置struts.xml文件

DownloadAction.java


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_32

struts.xml


java中文件的上载代码 java实现文件上传和下载_上传文件_33

 

1.结果类型必须要写成 type="stream"  ,与之对应的处理类是 org.apache.struts2.dispatcher.StreamResult

2.涉及到的数:

1) <param name="contentDisposition">attachment;fileName="${fileName}"</param>

contentDisposition默认是 inline(内联的), 比如说下载的文件是文本类型的,就直接在网页上打开,不能直接打开的才会打开下载框自己选择

2)  attachment :下载时会打开下载框

3)  fileName="${fileName}" :在这定义的名字是一个动态的,该名字是显示在下载框上的文件名字

3.<param name="inputName">DownloadFile</param>,这个DownloadFile名字要和DownloadAction.java类中的getDownloadFile()方法名去掉get 一致

Struts2下载文件实现的说明

contentType

内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

inputName

下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

contentDisposition

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:

attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline;filename="struts2.txt"

bufferSize

下载缓冲区的大小

downloadOne.jsp


java中文件的上载代码 java实现文件上传和下载_上传_34

 

例子的代码结构: 


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_35


java中文件的上载代码 java实现文件上传和下载_MVC_36


java中文件的上载代码 java实现文件上传和下载_上传_37

方法二:通过配置java文件来实现下载

DownloadByJavaAction.java


java中文件的上载代码 java实现文件上传和下载_MVC_38


java中文件的上载代码 java实现文件上传和下载_MVC_39

downloadByJava.jsp


java中文件的上载代码 java实现文件上传和下载_上传_40

struts.xml


java中文件的上载代码 java实现文件上传和下载_上传_41


java中文件的上载代码 java实现文件上传和下载_MVC_42

3、批量下载

多线程并发调用单个文件的下载方法即可。

4、断点续传

 有待研究。。。。。。。。。。

附件源码:

接: https://pan.baidu.com/s/1i6wo58L 密码: 3t3m


springMVC文件上传

文件上传是项目开发中最常见的功能。为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。只有在这样的情况下,浏览器才会把用户选择的文件以二进制数据发送给服务器。 
一旦设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。 
Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。 
Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。 
本项目作为测试案例,在此我就不创建Maven项目了,我直接创建的是一个Dynamic Web Project(动态的web项目),采用Tomcat 8作为web服务器,我们需要在项目中引入以下jar包,如下图:


java中文件的上载代码 java实现文件上传和下载_上传_43

下面我们在WebContent/WEB-INF下创建一个content文件夹,用于放文件的上传、下载等jsp文件,下面我们创建uploadForm.jsp文件,演示Spring MVC的文件上传:


java中文件的上载代码 java实现文件上传和下载_上传文件_44

负责上传文件的表单和一般表单有一些区别,负责上传文件的表单的编码类型必须是“multipart/form-data”。 
我们再src下创建一个包“cn.edu.jseti.controller”,然后创建一个FileUploadController类,用于实现文件的上传和下载功能。以下是负责上传文件的表单功能代码:


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_45

Spring MVC会将上传的文件绑定到MultipartFile对象中。MultipartFile提供了获取上传文件内容、文件名等方法。通过transferTo()方法还可以将文件存储到硬件中,MultipartFile对象中的常用方法如下:

  • byte[] getBytes():获取文件数据
  • String getContentType[]:获取文件MIME类型,如image/jpeg等
  • InputStream getInputStream():获取文件流
  • String getName():获取表单中文件组件的名字
  • String getOriginalFilename():获取上传文件的原名
  • Long getSize():获取文件的字节大小,单位为byte
  • boolean isEmpty():是否有上传文件
  • void transferTo(File dest):将上传文件保存到一个目录文件中

SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作。如果想使用Spring的文件上传功能,则需要在上下文中配置MultipartResolver。在springmvc-config.xml进行配置文件如下:


java中文件的上载代码 java实现文件上传和下载_上传_46

部署FileUpload这个Web应用,在浏览器中输入如下URL来测试应用: 

http://localhost:8088/FileUpload/uploadForm 

输入文件描述信息并选择上传文件,如下图: 

java中文件的上载代码 java实现文件上传和下载_MVC_47

 

点上传按钮,这是已将上传的文件通过二进制保存到web服务器上去了,如下图: 

java中文件的上载代码 java实现文件上传和下载_上传_48

使用对象接收上传文件

上面我们通过案例演示了Spring MVC上传文件,接下来,我们演示使用对象接收上传文件。 
在实际项目的开发中,很多时候上传的文件会作为对象的属性被保存。SpringMVC的处理也非常的简单。 
下面我们在content文件夹创建registerForm.jsp文件,演示接收文件上传:


java中文件的上载代码 java实现文件上传和下载_MVC_49

我们在src下面创建一个名叫“cn.edu.jseti.domain”包,然后再创建一个User类,必须要实现序列化接口,如下案例代码:


java中文件的上载代码 java实现文件上传和下载_上传_50

我们在刚才创建的FileUploadController类继续写用于接收文件的上传和下载功能。以下是负责接收文件的表单功能代码:

java中文件的上载代码 java实现文件上传和下载_上传_51

在content文件夹下创建userInfo.jsp文件,该页面主要是文件的下载页面,如下jsp代码:


java中文件的上载代码 java实现文件上传和下载_MVC_52

在浏览器中输入如下URL来测试应用: 

http://localhost:8088/FileUpload/registerForm 

输入用户名并上传刚才上传的文件。如下图: 

java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_53

 

单击“注册”按钮上传文件,然后就会跳到下载页面。如下图: 

java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_54

文件下载

上面我们通过案例演示了使用对象接收上传文件,接下来,我们演示Spring MVC的下载文件。 
文件下载比较简单,直接在页面给出了一个超接,该链接href的属性等于要下载文件的文件名,就可以实现文件下载了。但是如果该文件的文件名为中文文件名,在某些早起的浏览器上就会导致下载失败;如果使用最新的Firefox、Chrome、Opera、Safari则都可以正常下载文件名为中文的文件了。 
SpringMVC提供了一个ResponseEntity类型,使用它可以很方便地定义返回的HttpHeaders和HttpStatus。以下代码演示文件的下载功能:


java中文件的上载代码 java实现文件上传和下载_MVC_55

download处理方法接收页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取项目的上传文件,并将其构建成ResponseEntity对象返回客户端下载。 

使用ResponseEntity对象,可以很方便的定义返回的HttpHeaders和HttpStatus。上面代码中的MediaType,代表的是Internet Media Type,即互联网媒体类型,也叫做MIME类型。在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。HttpStatus类型代表的是Http协议中的状态。有关MediaType和HttpStatus类可以考Spring MVC的API文档。 

点击下载页面的超接,显示文件正在下载,如下图所示: 

java中文件的上载代码 java实现文件上传和下载_上传_56

单击“浏览”按钮,可以选择下载文件的保存路径,然后单击“确定”按钮,文件就会顺利的下载并保存。

本文中的一些功能案例代码和配置文件不是很完整,下面附上完整代码: 
FileUploadController类完整的代码如下:

java中文件的上载代码 java实现文件上传和下载_上传文件_57

java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_58

文件上传成功的jsp代码:


java中文件的上载代码 java实现文件上传和下载_java中文件的上载代码_59

文件上传失败的jsp代码:


java中文件的上载代码 java实现文件上传和下载_MVC_60

web.xml的配置文件:


java中文件的上载代码 java实现文件上传和下载_上传文件_61

OK,以上就是完整的使用Spring MVC框架实现了文件的上传和下载。