菜鸟学Android笔记(二十七):Response下载
来源:互联网 发布:java 判断类是否存在 编辑:程序博客网 时间:2024/05/16 10:11
一、如何将服务器的图片让浏览器显示出来?
第一步:先在web应用的根目录下放上一张图片1.jpg
第二步:在classes文件夹创建DownServlet.java
package com.java;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DownServlet extends HttpServlet{public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {InputStream in=new FileInputStream(this.getServletContext().getRealPath("1.jpg"));OutputStream out=resp.getOutputStream();byte[] bs=new byte[1024];int i=0;while((i=in.read(bs))!=-1){out.write(bs, 0, i);}in.close();}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req,resp);}}
第三步:在web.xml创建访问DownServlet路径的配置:
<servlet> <servlet-name>DownServlet</servlet-name> <servlet-class>com.java.DownServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownServlet</servlet-name> <url-pattern>/java/DownServlet</url-pattern> </servlet-mapping>然后在浏览器访问就可以了
二、如何让图片可以下载(关键是修改DownServlet.java的功能)?
package com.java;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DownServlet extends HttpServlet{public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//关键部分的代码,Content-Disposition是关于文件下载的部分resp.setHeader("Content-Disposition", "attachment;filename=1.jpg");InputStream in=new FileInputStream(this.getServletContext().getRealPath("1.jpg"));OutputStream out=resp.getOutputStream();byte[] bs=new byte[1024];int i=0;while((i=in.read(bs))!=-1){out.write(bs, 0, i);}in.close();}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req,resp);}}如果将文件名改为中文会怎么样?结果是图片可以下载,但是无法显示,文件名也无法显示(原因在于:这里是UTF-8编码无法显示中文)
如何解决这个问题?
可以利用url编码来解决?
什么是url编码?
URL编码既不是utf-8也不是gbk等我们常用的字符编码。而是RFC1738编码(除将空格编码为加号“+”不符合外)。类似于http://www.baidu.com/s?wd=%B9%FE%B9%FE&word=%B9%FE%B9%FE,其实就是经过RFC1738编码的URL地址。RFC1738字符集中,将URL中除了 - _ . 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。除空格编码为加号(+)外。我们访问的网站都会对使用RFC1738字符集的URL做出正确的解析。因为这是国际组织早就规定好了的。DNS服务器一般不会涉及到这块,因为DNS是域名解析器,顾名思义,他只是解释http://www.baidu.com这一部分,而涉及到RFC1738字符集的大部分是后面的参数部分。当我们在地址栏输入字符串的时候,不论你用的是什么字符集最后都会转化为使用RFC1738字符集编码的URL地址。修改后的DownServlet.java:
package com.java;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class DownServlet extends HttpServlet{public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//resp.setHeader("Content-Disposition", "attachment;filename=美景.jpg");//上面没有将美景转化为url编码,现在下面的就转化了resp.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("美景.jpg","utf-8"));InputStream in=new FileInputStream(this.getServletContext().getRealPath("美景.jpg"));OutputStream out=resp.getOutputStream();byte[] bs=new byte[1024];int i=0;while((i=in.read(bs))!=-1){out.write(bs, 0, i);}in.close();}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req,resp);}}ps:编码可以相互转化的,可以看下面的实例:
package com.java;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;public class Test01 {public static void main(String[] args) throws UnsupportedEncodingException {String str="中国";String str2=URLEncoder.encode(str,"utf-8");System.out.println(str2);String str3=URLDecoder.decode("%E4%B8%AD%E5%9B%BD","utf-8");System.out.println(str3);}}
结果输出:
%E4%B8%AD%E5%9B%BD
中国
0 0
- 菜鸟学Android笔记(二十七):Response下载
- 菜鸟学Android笔记(二十六):Response数据输出
- 菜鸟学Android笔记(二十八):response实现定时刷新
- 菜鸟学Android笔记(十七):http协议概述
- 菜鸟学Android笔记(三十一):Response实现验证码
- 菜鸟学Android笔记(二十三):ServletConfig
- 菜鸟学Android笔记(二十四):ServletContext1
- 菜鸟学Android笔记(二十五):ServletContext2
- Android笔记(二十七)sqlite数据库
- 菜鸟学Android笔记(二十二):Servlet的一些细节
- 菜鸟学Andoid笔记(三十):Response实现重定向和注意事项
- 菜鸟学jsp(二)
- 菜鸟学JDBC(二)
- 菜鸟学Java(十七)——Jboss瘦身
- 菜鸟学Android(二十):Servlet的调用过程
- 学习笔记(二十七)
- Android开发笔记(二十七)对象序列化
- 菜鸟学android(二): XML概述
- jQuery 设置属性的值
- Linux-C成长之路(一)Linux C编程实战之路 Linux下C编程概要
- netBeans中文乱码
- 不安装oracle,配置plsql
- 大数据学习一
- 菜鸟学Android笔记(二十七):Response下载
- Python基础(上)
- Java多线程系列--“JUC原子类”04之 AtomicReference原子类
- HashMap与ConcurrentHashMap的区别
- 类
- 生成19位数字GUID
- 光纤类型
- MyBatis3整合Spring3、SpringMVC3
- Spiral Matrix && Spiral Matrix II