博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb学习总结二十六(response对象的用法二 下载文件)
阅读量:5037 次
发布时间:2019-06-12

本文共 3177 字,大约阅读时间需要 10 分钟。

一:浏览器打开服务器上的文件

1:读取服务器上面的资源,如果在web层,可以直接使用servletContext,如果在非web层

可以使用类加载器读取文件

2:向浏览器写数据,实际上是把数据封装到response对象上,然后服务器发现response中响应

体中有数据绑定,然后写给浏览器

3:设置响应头,控制浏览器的读取或者解析方式

如下:打开服务器上的图片

1 /**在页面上查看图片*/ 2     private void viewImage(HttpServletResponse response) throws IOException { 3         // 设置响应头   在网页上查看图片 4         response.setHeader("content-type", "image/jpeg"); 5         InputStream in = this.getServletContext().getResourceAsStream( 6                 "/download/1.jpg"); 7         OutputStream out = response.getOutputStream(); 8         int length = 0; 9         byte[] buf = new byte[1024];10         while ((length = in.read(buf)) > 0) {11             out.write(buf, 0, length);12         }13         out.flush();14         out.close();15     }

 

二:下载服务器上面的文件

1:下载文件与打开文件类似,都是先读取服务器上面的文件,然后再想浏览器写文件,

只是响应头不同而已。

 response.setHeader("content-disposition", "attachment;filename=1.jpg");

1 /**下载图片*/ 2     private void downloadImage(HttpServletResponse response) throws IOException { 3         // 设置响应头   在网页上查看图片 4         response.setHeader("content-disposition", "attachment;filename=1.jpg"); 5         InputStream in = this.getServletContext().getResourceAsStream( 6                 "/download/1.jpg"); 7         OutputStream out = response.getOutputStream(); 8         int length = 0; 9         byte[] buf = new byte[1024];10         while ((length = in.read(buf)) > 0) {11             out.write(buf, 0, length);12         }13         out.flush();14         out.close();15     }

2:如果需要获取文件的名称,最好先获取服务器上文件的绝对路径,然后在读取,写内容到浏览器。

String path = this.getServletContext().getRealPath("/download/高圆圆.jpg");

1 private void downloadImage2(HttpServletResponse response){ 2         String path = this.getServletContext().getRealPath("/download/高圆圆.jpg"); 3         String filename = path.substring(path.lastIndexOf("\\")+1); 4                  //设置下载文件响应头 5         response.setHeader("content-disposition", "attachment;filename="+filename); 6         InputStream in = null; 7         OutputStream out = null; 8         try { 9             in = new FileInputStream(path);10             out = response.getOutputStream();11             int len = 0;12             byte[] buf = new byte[1024];13             while((len = in.read(buf)) > 0){14                 out.write(buf, 0, len);15             }16         } catch (Exception e) {17             e.printStackTrace();18         } finally{19             if(null != in){20                 try {21                     in.close();22                 } catch (IOException e) {23                     e.printStackTrace();24                 }25             }26             if(null != out){27                 try {28                     out.close();29                 } catch (IOException e) {30                     e.printStackTrace();31                 }32             }33         }34     }

如果文件名为中文时,下载会出现乱码问题,导致无法下载,

这时我们可以先对文件名称进行编码,如下:

1 String filename = path.substring(path.lastIndexOf("\\")+1);2         try {3             filename = URLEncoder.encode(filename,"utf-8");4         } catch (UnsupportedEncodingException e1) {5             e1.printStackTrace();6         }

这样乱码问题就解决了!

 

转载于:https://www.cnblogs.com/warrior4236/p/6024883.html

你可能感兴趣的文章
MySQL:如何维护binlog?
查看>>
Android Studio 的常用设置
查看>>
Pythonic八荣八耻
查看>>
p2.BTC-数据结构
查看>>
封装自己的getClass
查看>>
python字符串的常用方法
查看>>
.net4.0、.net4.5、.net4.6 三者对系统的要求
查看>>
分布式下的session处理方式
查看>>
LeetCode(30) Substring with Concatenation of All Words
查看>>
哈夫曼编码问题再续(下篇)——优先队列求解
查看>>
炜煌E30 E31微型热敏打印机 STM32 串口驱动
查看>>
Swift 2 有哪些新特性
查看>>
[js]变量与数据类型篇
查看>>
[BZOJ2054] 疯狂的馒头 并查集
查看>>
js 正则表达式
查看>>
Eclipse新建Web应用,Server端口(8080,8005,8009)被占用解决办法
查看>>
Android Content Provider Guides
查看>>
线程结束的正确方式
查看>>
信息安全
查看>>
centos7防火墙查看、启动、停止、添加、移除端口
查看>>