菜鸟学Android笔记(二十七):Response下载

一、如何将服务器的图片让浏览器显示出来?

第一步:先在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值