javaweb学习总结二十六(response对象的用法二 下载文件)
一:浏览器打开服务器上的文件
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对象的用法二 下载文件)的更多相关文章
- Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码
请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...
- javaweb学习总结二十五(response对象的用法一)
一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:r ...
- javaweb学习总结(四十六)——Filter(过滤器)常见应用
一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 1 package me.gacl.web.filter; 2 3 import ja ...
- JavaWeb学习笔记(十六)—— 事务
一.事务概述 1.1 什么是事务 银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句: 给张三的账户减去10000元: 给李四的账户加上10000元. 如果在第一条SQL语句执行成功后 ...
- JavaWeb学习记录(十六)——防止表单重复提交
产生随机字符串进行验证,如果产生的和Session存储的相同则可以提交,提交后删除session对应的属性值:否则表单提交不成功 一.产生随机字符串的工具类 package web10.util; i ...
- javaweb学习总结(三十六)——使用JDBC进行批处理
在实际的项目开发中,有时候需要向数据库发送一批SQL语句执行,这时应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率. JDBC实现批处理有两种方式:statement和pr ...
- JavaWeb学习总结(十六)Cookie保存中文内容
Cookie的值保存中文内容,可以使用Java.net.URLDecoder进行解码. 示例: <%@page import="java.net.URLDecoder"%&g ...
- (二十六)svn的问题二
上周五请了一天假,电脑放在公司没有带回来,三天的时间都没有看代码,使得我电脑上的东西与svn上相差了太多,因为不一样,所以就要更新同步,因为要更新同步的东西多,便又出了一些问题,也因此对svn有了更进 ...
- 爪哇国新游记之二十八----从url指定的地址下载文件到本地
package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...
随机推荐
- OpenSSL命令---ciphers
用途: 指令是用来展示用于SSL加密算法的工具.它能够把所有openssl支持的加密算法按照一定规律排列(一般是加密强度).这样可以用来做测试工具,决定使用什么加密算法. 用法: openssl ci ...
- 更有效率的使用Visual Studio(一)
很多比较通用的快捷键的默认设置其实是有一些缩写在里面的,这个估计也是MS帮助我们记忆.比如说注释代码的快捷键是Ctrl + E + C,我们如果知道它是 Ctrl + Edit + Comment C ...
- hdoj 5373 The shortest problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5373 一开始想到用整除11的性质去做,即奇位数的和和偶位数的和的差为11的倍数,但估不准数据范围没敢去 ...
- MFC中显示 .bmp格式的位图
最近在看VisualC++ 图像处理的书籍,表示一直在从基础做起,今天就记录一个简单功能的实现,显示.bmp格式的位图. 首先需要理解的是窗口创建的过程包括两个步骤:首先擦除窗口的背景,然后在对窗口进 ...
- PHP 打印调用函数入口地址(堆栈),方便调式
今天网站出现一个BUG,然后直接在数据库类里面写日志,看是哪条SQL出了问题,SQL语句到是找到了,但是不知道这条SQL语句来自何处,于是就想啊,如果能有一个办法,查看当前正在运行的这个方法是被哪个方 ...
- Background Worker Component
http://www.delphiarea.com/products/delphi-components/backgroundworker/ Background Worker Component ( ...
- li在IE中底部空行的BUG
li在IE中底部空行的BUG 但是这次li在IE中底部出现的不是3像素而是一整条空白行,如图:HTML代码: <ul> <li><a href="#" ...
- SCVMM之Windows Server2012 R2新功能
在Windows Server 2012 R2中可以通过使用共享的虚拟硬盘VHDX文件的方法来模拟IP SAN,来为虚拟机创建群集提供共享存储.这样为虚拟机创建群集时就不用再像以前一样通过使用软件模拟 ...
- Codeforces Round #309 (Div. 2) B. Ohana Cleans Up 字符串水题
B. Ohana Cleans Up Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/554/pr ...
- C#基本线程同步
0 概述 所谓同步,就是给多个线程规定一个执行的顺序(或称为时序),要求某个线程先执行完一段代码后,另一个线程才能开始执行. 第一种情况:多个线程访问同一个变量: 1. 一个线程写,其它线程读:这种情 ...