java dopost 下载文件_JavaWeb——HttpServletResponse的使用,文件下载

HTTPServletRespons

我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

TomCat下Servlet的请求和响应流程

23ce8485724ae4b57f2b2524573d02a85db.jpg

设置HTTP响应

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响 应头和响应体

371109607d9c76b2ac0ab2165d0a393fa11.jpg

一、设置响应行

response.setStatus(404);  // 设置响应状态码

示例:设置重定向

response.sendRedirect("http://www.baidu.com");

实际上执行的是下面的两行代码

response.setStatus(302);  // 设置302响应码

response.setHeader("Location","http://www.baidu.com")  // 设置响应头,重定向

b2cad722dfcdea2d7370f72d62b658a18c1.jpg

f90d2a7be6bdce028ec42a52fe944f2506b.jpg

1

2

3

4

5

Insert title here

6

7

8 恭喜你,注册成功,5秒钟后跳转,如不跳转点击这里!.9

10 window.οnlοad= function(){

11 vartime= 5;12 varsecondEle=document.getElementById("second");13 vartimer=setInterval(function(){14 secondEle.innerHTML=time;15 time--;16 if(time==0){17 clearInterval(timer);

18 location.href="http://www.baidu.com";

19 }20

21 },1000);

22 }23

24

25

26

27

28

JS版跳转页面

二、设置响应头

response.setHeader(Key,Value)

示例:

response.setHeader("refresh","5;url=http://www.baidu.com");  // 设置页面加载后5s跳转到指定url

三、设置响应体

1)返回文本数据

response.getWriter().write("你好,world.");

中文乱码问题

原因:在服务器端有一个Response缓冲区,当我们书写 "你好,world."的时候,会查询ISO-8859-1编码表将其转换成字节形式,但此编码表中没有中文,所以返回的就是一堆?。

解决办法:

response.setCharacterEncoding("UTF-8");  // 设置缓冲区的编码集为UTF-8格式

response.setHeader("Content-Type","text/html; charset=utf-8");  // 设置响应头为utf-8格式

简便模式

response.setContentType("text/html; charset=utf-8");

2)返回字节型(图片等)数据

OutputStream out = response.getOutputStream(); // 字节输出流

示例:传图片文件

String real_path = super.getServletContext().getRealPath("a.png");   // 获取文件的绝对路径

InputStream in = new FileInputStream(real_path); // 字节输入流

OutputStream out = response.getOutputStream(); // 字节输出流

byte[] b = new byte[1024];    // 初始化字节数组

int len = 0;

while((len=in.read(b))!=-1){

out.write(b,0,len);  // 写

}

in.close();    // 关闭字节输出流

out.close();    // 这个可以不用写,TomCat会帮我们关的

示例:文件下载案例

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取要下载的文件名称

String filename = request.getParameter("filename");

// 设置下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型

response.setContentType(this.getServletContext().getMimeType(filename));

// 设置请求头,告诉客户端该文件不是直接解析,而是以附件形式打开(下载)

response.setHeader("Content-Disposition", "attachment;filename="+filename);

// 获取文件的绝对路径

String path = super.getServletContext().getRealPath("download/"+filename);

// 实例化文件输入流

InputStream in = new FileInputStream(path);

// 获取文件输出流

OutputStream out = response.getOutputStream();

// 实例化字节数组

byte[] b = new byte[1024];

int len = 0;

while ( (len=in.read(b))!=-1 ){

out.write(b,0,len);

}

in.close(); // 关闭输入流

}

但这样会发现,下载中文名称的文件,下载的文件没有名字,所以我们要根据不同的浏览器对其修改编码

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 获取要下载的文件名称

String filename = request.getParameter("filename");

//如果中文有问题的话,使用下面的代码,修改编码格式

//filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");

//======================= 根据浏览器的不同,进行不同的编码 =======================

//获得请求头中的User-Agent

String agent = request.getHeader("User-Agent");

//根据不同浏览器进行不同的编码

String filenameEncoder = "";

if (agent.contains("MSIE")) {

// IE浏览器

filenameEncoder = URLEncoder.encode(filename, "utf-8");

filenameEncoder = filenameEncoder.replace("+", " ");

} else if (agent.contains("Firefox")) {

// 火狐浏览器

BASE64Encoder base64Encoder = new BASE64Encoder();

filenameEncoder = "=?utf-8?B?"

+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";

} else {

// 其它浏览器

filenameEncoder = URLEncoder.encode(filename, "utf-8");

}

// 设置下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型

response.setContentType(this.getServletContext().getMimeType(filename));

// 设置请求头,告诉客户端该文件不是直接解析,而是以附件形式打开(下载)================== 设置响应头的文件名为编码后的名字

response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);

// 获取文件的绝对路径

String path = super.getServletContext().getRealPath("download/"+filename);

// 实例化文件输入流

InputStream in = new FileInputStream(path);

// 获取文件输出流

OutputStream out = response.getOutputStream();

// 实例化字节数组

byte[] b = new byte[1024];

int len = 0;

while ( (len=in.read(b))!=-1 ){

out.write(b,0,len);

}

in.close(); // 关闭输入流

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值