HttpServletResponse图片下载实例(OutputStream,PrintWriter)

HttpServletResponse进行图片下载时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。

OutputStream下载图片

//HttpServletResponse OutputStream下载图片例子
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
	 //1、得到文件的绝对路径,并且通过该路径得到一个字节输入流  
	 String path = this.getServletContext().getRealPath("/WEB-INF/classes/51gjie.png");//得到下载文件的绝对路径  
	 FileInputStream fis = new FileInputStream(path);  
	 //2、创建字节输出流  
	 ServletOutputStream sos = resp.getOutputStream();  
	 //3、得到下载的文件名  
	 String filename = path.substring(path.lastIndexOf("\\")+1);//得到的文件名为TomCat.png  
	 //4、设置文件编码  
	 filename = URLEncoder.encode(filename, "UTF-8");//编码为UTF-8  
	 //5、告知客户端(浏览器)要下载文件  
	 resp.setHeader("content-disposition", "attachment;filename="+filename);  
	 resp.setHeader("content-type", "image/png");//文件类型  
	 //6、输出  
	 byte[] b = new byte[1024];  
	 int len = 0;  
	 while((len=fis.read(b)) != -1){  
		sos.write(b, 0, len);  
	 }  
	 sos.close();  
	 fis.close();  
}  

注意下载图片的时候也需要注意编码的问题,第四步将不安全的文件名改为UTF-8编码,即将文件名中的字母用他们本身替换,将"."、","、"_"、"-"、"*"用他们本身替换,将空格替换为"+",除了这些以外的字符,都是不安全字符,将它们替换为%xy,即16进制格式,其中xy是两个16进制数值。

PrintWriter下载图片

//HttpServletResponse PrintWriter下载图片实例
private void downloadFileByPrintWriter(HttpServletResponse response) throws FileNotFoundException, IOException {
    String realPath = this.getServletContext().getRealPath("/download/51gjie.JPG");//获取要下载的文件的绝对路径
    String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);//获取要下载的文件名
    //设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码
    response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8"));
    FileReader in = new FileReader(realPath);
    int len = 0;
    char[] buffer = new char[1024];
    PrintWriter out = response.getWriter();
    while ((len = in.read(buffer)) > 0) {
        out.write(buffer,0,len);//将缓冲区的数据输出到客户端浏览器
    }
    in.close();
} 

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。