javaweb学习总结二十六(response对象的用法二 下载文件)

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

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         }

这样乱码问题就解决了!

时间: 2024-07-30 10:17:42

javaweb学习总结二十六(response对象的用法二 下载文件)的相关文章

javaweb学习总结二十五(response对象的用法一)

一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:response对象案例分析 1:向客户端输出中文数据 1 package com.hlcui.servlet; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.io.PrintWriter; 6

javaweb学习总结(四十六)——Filter(过滤器)常见应用

一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import java.io.IOException; 4 import javax.servlet.Filter; 5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.Serv

javaweb学习总结(三十六)——使用JDBC进行批处理

在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和preparedstatement 一.使用Statement完成批处理 1.使用Statement对象添加要批量执行SQL语句,如下: 1 Statement.addBatch(sql1); 2 Statement.addBatch(sql2); 3 Statement.addBatch(sql3);

JavaWeb学习记录(十六)——防止表单重复提交

产生随机字符串进行验证,如果产生的和Session存储的相同则可以提交,提交后删除session对应的属性值:否则表单提交不成功 一.产生随机字符串的工具类 package web10.util; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; public

应用程序框架实战二十六:查询对象

信息系统的查询需求千变万化,在仓储中为每个查询需求创建一个特殊方法,将导致大量乏味而臃肿的接口. 一种更加可行的办法是,在应用层服务中描述查询需求,并通过仓储执行查询. 为了能够更好的描述查询需求,可以将查询功能从仓储中抽取出来,专门创建一个查询对象. 查询最复杂的部分是条件过滤,这也是查询对象的主要职责.查询对象可以认为是规约模式的一个变种,允许查询对象动态创建查询条件. 在Util.Domains项目Repositories目录中,创建查询对象基接口IQueryBase,代码如下. usin

一起学Java(二十六)----- 对象之间赋值

不积跬步,无以至千里:不积小流,无以成江海. Java语言基础 Java对象之间赋值 赋值是用等号运算符“ = ”进行的,在对对象进行“赋值”时,实际就是将句柄从一个地方复制到另一个地方.这意味着假若为对象使用“A = B”,那么A和B最终都会指向最初只有B才指向的那个对象.也就是说这个时候他们两个引用了同一块内存地址. class Number{ int i; } public class Test { public static void main(String[] args) { Numb

quick-cocos2d-x 学习系列之十六 塔防完结

quick-cocos2d-x 学习系列之十六 塔防完结 1.  math2d.lua文件 该文件实现了常用的数学函数. Dist函数实现两点的距离. radians4point求两点的夹角(弧度) pointAtCircle求圆上一个点的位置 pointAtLineToPoint求线段上与指定点距离最近的点 degrees2radians角度转换为弧度 radians2degrees弧度转换为角度 2.  utils.lua文件 2.1         drawCircle 返回newCirc

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

javaweb学习总结(三十二)——JDBC学习入门【转】

原文地址:javaweb学习总结(三十二)——JDBC学习入门 一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后 才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数 据库打交道,如下所示: 1.2.JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作