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

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

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

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

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

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

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

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

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

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

只是响应头不同而已。

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

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

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

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

 private void downloadImage2(HttpServletResponse response){
String path = this.getServletContext().getRealPath("/download/高圆圆.jpg");
String filename = path.substring(path.lastIndexOf("\\")+1);
//设置下载文件响应头
response.setHeader("content-disposition", "attachment;filename="+filename);
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(path);
out = response.getOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
if(null != in){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != out){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

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

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

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

这样乱码问题就解决了!

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

  1. Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码

    请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...

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

    一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:r ...

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

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...

  4. JavaWeb学习笔记(十六)—— 事务

    一.事务概述 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功后 ...

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

    产生随机字符串进行验证,如果产生的和Session存储的相同则可以提交,提交后删除session对应的属性值:否则表单提交不成功 一.产生随机字符串的工具类 package web10.util; i ...

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

    在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...

  7. JavaWeb学习总结(十六)Cookie保存中文内容

    Cookie的值保存中文内容,可以使用Java.net.URLDecoder进行解码. 示例: <%@page import="java.net.URLDecoder"%&g ...

  8. (二十六)svn的问题二

    上周五请了一天假,电脑放在公司没有带回来,三天的时间都没有看代码,使得我电脑上的东西与svn上相差了太多,因为不一样,所以就要更新同步,因为要更新同步的东西多,便又出了一些问题,也因此对svn有了更进 ...

  9. 爪哇国新游记之二十八----从url指定的地址下载文件到本地

    package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...

随机推荐

  1. iisapp 命令 弹出 iisschlp.wsc [88,25] 属性值无效 progid

    iisapp 命令 弹出 iisschlp.wsc [88,25] 属性值无效 progid 在执行iisapp.vbs时,可能会提示如下错误:Windows Script Component - f ...

  2. winform 发布应用程序 提示 “未能注册模块(程序路径)\ieframe.dll”

    程序安装的时候出现未能注册模块(程序路径)\ieframe.dll提示 这种情况的出现,是因为引用的shdocvw.dll,目前发现了一个折中的解决方法,在安装程序里面,可以看到ieframe.dll ...

  3. C:指针、数据类型、格式化输入输出、输入函数的坑点

    指针.数据类型.格式化输入输出.输入函数的坑点 有时候我们迷茫的时候,坚持就是最好的选择. 1.指针的分类为什么很重要? 参考 答:因为指针会根据相应的类型取对应长度的数据,类型决定所取数据的长度.如 ...

  4. kafka分布式消息队列 — 基本概念介绍

    [http://www.inter12.org/archives/818] 这个应该算是之前比较火热的词了,一直没时间抽出来看看.一个新东西出来,肯定是为了解决某些问题,不然不会有它的市场.先简单看下 ...

  5. php 将字符串中的连续多个空格转换为一个空格

    转载自:http://www.phpernote.com/php-function/633.html /** * 多个连续空格只保留一个 * * @param string $string 待转换的字 ...

  6. ATSHA204加密认证IC

    The Atmel® ATSHA204 is a full turnkey security device. It includes a 4.5Kb EEPROM divided into 16 sl ...

  7. windows7下实现局域网内文件共享

    1.右击桌面网络----属性----更改高级共享设置 (注释:查看当前网络 比如:家庭网络.公共网络 等!) "我这里为公共网络" 2.选择 公共网络---选择以下选项:启动网络发 ...

  8. 为DAG预留群集名称对象(CNO)

    在某些环境中,计算机帐户的创建受到限制或计算机帐户是在非默认计算机容器中创建的,则会预留群集名称对象 (CNO),然后通过为其分配权限来设置 CNO.此外,使用运行 Windows Server 20 ...

  9. 利用KindEditor的uploadbutton实现异步上传图片

    利用KindEditor的uploadbutton实现异步上传图片 异步上传图片最经常使用的方法就是图片在iframe中上传.这样仅仅须要刷新iframe.而不用刷新整个页面.     KindEdi ...

  10. 如何在XAF中显示自定义窗体和控件

    https://www.devexpress.com/Support/Center/Example/Details/E911