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

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. XML与DataSet相互转换,DataSet查询

    以FileShare.Read形式读XML文件: string hotspotXmlStr = string.Empty; try { Stream fileStream = new FileStre ...

  2. c++中的signal机制

    简介 signal是为了解决类之间通信的问题而出现的,更深入的原因是面向对象讲究封装,但是封装必然导致类之间沟通困难,但是使用接口的方式又太重量级--需要写很多代码,而且会导致接口爆炸 比如你需要把一 ...

  3. Unity3d:使用uWebKit插件嵌入网页,网页中的flv视频无法播放

    问题描述:unity3d程序,使用uWebKit插件嵌入网页,用来播放FLV视频,有的电脑可以正常播放,有的电脑在网页中播放不了ps:网页中的播放器用的是player.swf解决方案:是由于网页中的播 ...

  4. 初步认识shell

    言语不多说,直奔主题,lz不善于写文章,只是记录自己学习过程中的点点滴滴. 注意:shell对于字母大小写比较敏感. 打开终端出现:username@hostname$或者root@hostname# ...

  5. SCROLLINFO结构体中fMask和nPage的理解

    还是VC++中有关显示图像的问题. 我们在显示一幅比较大的图像时,要使用带标准滚动条的对话框.涉及对滚动条的操作就不得不提SCROLLINFO这个结构体.只看单词意思就这道这个结构体要储存滚动条的一些 ...

  6. 【腾讯内部干货分享】分析Dalvik字节码进行减包优化

    http://wetest.qq.com/lab/view/?id=96?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.192184.TAS ...

  7. html的下拉框的几个基本使用方法

    尽管使用EXT开发了一段时间,可是自己认为我对javascript还是不是非常熟,所以边看书边做小样例 给自己以后用到的时候查看下,都是非常主要的东西,对刚開始学习的人可能有点帮助 以下是代码 < ...

  8. Codeforces Round #335 (Div. 2) B. Testing Robots 水题

    B. Testing Robots Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contest/606 ...

  9. Linux内核探讨-- 第七章

    本文是个人分析<Linux内核设计与实现>而写的总结,欢迎转载,请注明出处: http://blog.csdn.net/dlutbrucezhang/article/details/136 ...

  10. HDU 4336 Card Collector 数学期望(容斥原理)

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意简单,直接用容斥原理即可 AC代码: #include <iostream> ...