欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

servlet实现文件下载的步骤及说明详解

程序员文章站 2024-02-28 15:32:16
servlet实现文件下载所需步骤及说明,供大家参考,具体内容如下 参考文章:servlet实现文件下载功能 1.原理介绍:    &n...

servlet实现文件下载所需步骤及说明,供大家参考,具体内容如下

参考文章:servlet实现文件下载功能

1.原理介绍:

        web容器为servlet生成并且传递的httpservletresponse对象不仅可以返回html文本,而且可以返回任何主流的其他文件格式,例如,.doc、.pdf、.jar、.avi等内容格式的文件.这些类型内容在http协议中主要是体现在http响应消息中的消息头部的content-type字段以及响应有效负载中.
content-type是向浏览器指明有效负载区里的内容是某某类型的,例如:.jar类型的内容.
而有效负载中的内容就是目标文件的字节集合,也就是二进制内容格式,而不是具体的类似于html的文本格式内容.

        因此,可以说servlet可以利用httpservletresponse对象返回任何想要返回的内容。

        需要通过httpservletresponse的实例去设置http协议响应消息消息头部的一些属性,这个是通过response.addheader()或response.setheader()或response.setintheader()函数来完成的。

这三个方法均有两个参数:第一个参数是属性名,第二个参数是属性值。

2.所需步骤:

  2.1 response.setheader("content-type","文件格式所对应的内容类型")

具体要根据国际标准的mime属性来制定,很多种格式的文件类型在mime都会有对应,

如果直接通过url来指定具体资源文件,则apache服务器会根据服务器上的资源文件类型生成相应的http相应消息的content-type类型,

但是如果不是直接通过url指定资源文件,而是指向一个servlet,则在servlet内部就需要通过代码显式来指定响应消息中的content-type类型,否则不同种类的浏览器会有不同的动作,也很有可能使浏览器崩溃。

  2.2 response.setheader("content-disposition","attachment;filename=" + 文件名称)

       指定文件保存的默认命名,上例指定为utils.jar,是通过"content-disposition"属性指定的,如果不指定则浏览器会默认指定为当前servlet的url名称,例如codeservlet.do,也就是说扩展名变成了.do而不是.jar.

  2.3 获取文件,并读取文件

  2.4 以字节流的方式返回页面

实例:

/**
 * 处理文件下载的post
 * @throws ioexception
 */
protected void dopost(httpservletrequest request, httpservletresponse response)
  throws servletexception, ioexception {
 // 1.获得请求文件名
 string filename = request.getparameter("filename");
 // 2.设置文件mime类型(指定要返回内容的类型)
 response.setcontenttype(getservletcontext().getmimetype(filename));
 // 3.设置content-disposition(指定下载该文件时的文件名)
 response.setheader("content-disposition", "attachment;filename=" + filename);
 // 4.读取目标文件,通过response将目标文件写到客户端
 // 4.1 获取目标文件的绝对路径
 string filepath = "web-inf/uploadfiles/" + filename;
 filepath = this.getservletcontext().getrealpath(filepath);
 // 4.2 读取文件
 inputstream in = new fileinputstream(filepath);
 // 4.3 输出文件
 outputstream out = response.getoutputstream();
 // 写文件
 int n;
 while ((n = in.read()) != -1) {
  out.write(n);
 }

 in.close();
 out.close();
}


说明:

1.所需jar包,版本不限

commons-fileupload-1.3.1.jar

commons-io-2.2.jar

2.导包时不要导错了

import java.io.fileinputstream;
import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;

3.更多对于文件的操作,请移步文章:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。