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原创文章,未经本站允许不得转载。