原理:采用ServletOutputStream对象直接从一个字节输入流中读取出来,然后再原封不动的输出到客服端。
具体如下:
一.给下载文件名设置utf-8格式
try{
fileName=URLEncoder.encode(fileName,"utf-8");
} catch(UnsupportedEncodingException e1){
e1.printStackTrace();
}
二.设置消息头
//response.setContentType():这 个方法设置发送到客户端的响应的内容类型,此时响应还没有提交
//如果response的contenttype是text/html,那么就直接通过浏览器就可以解析内容了。
//如果response的contenttype是application/x-excel,那么浏览器就不能自己解析了,就需要通过excel程序来打开,或者另存为文件
//response.setContentType("application/octet-stream");//告诉浏览器输出内容为流
//Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。
//此报文头content-disposition, 对报文体进行描述, 规定了接收端的显示处理行为。
//此报文头的值有两种, attachment 和 inline, 分别表示保存 还是 直接显示。
response.setContentType("application/octet-stream");
response.setHeader("content-disposition","attachment;fileName" +fileName)
三.把字节数组放入流中,返回给前端
try(ServletOutputStream outStream=response.getOutputStream()){
byte[] bs= new byte[1024];
outStream.write(bs,0,bs.length);
outStream.fluse();
}catch(Exception e){
e.printStackTrace();
}