菜鸟学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