如何使用servlet下载图片

1.前端页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


     下载

2.后台下载servlet

package org.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.codec.binary.Base64;




@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
   

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	request.setCharacterEncoding("utf-8");
	//获取文件的名称
	String filename =request.getParameter("filename");

	//2.下载文件,必须设置响应消息头(application/octet-stream 二进制类型通用)
	response.setHeader("content-Type", "application/octet-stream");//MIME类型
	
	
	//获取客户端类型
	String agent =request.getHeader("User-agent");
	//解决不同浏览器下载乱码问题
	//火狐
	if(agent.toLowerCase().indexOf("firefox")!=-1){
		//response.setHeader("content-Disposition")告诉客户端该文件不是直接解析,而是以附件打开(下载)
		response.setHeader("content-Disposition", "attachment;filename==?UTF-8?B?"+new String(Base64.encodeBase64(filename.getBytes()),"UTF-8")+"?=");//这里文件名包含后缀
	}else{
		response.setHeader("content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "UTF-8"));//这里文件名包含后缀
	}
	//Servlet通过文件地址,将文件转为输入流读入到servlet中
	InputStream input = getServletContext().getResourceAsStream("/res/"+filename);

	//产生一个输出流,返回客户端
	ServletOutputStream outputStream = response.getOutputStream();
	byte[] bs = new byte[1024];
	int len =-1;
	//如果缓存中没有读取完,则继续循环
	while((len=input.read(bs))!=-1){
		outputStream.write(bs,0,len);
	}
	System.out.println(filename +"下载成功");
	//先关闭输出流
	outputStream.close();
	//然后再关闭输入流
	input.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

3.下载文件所在项目的路径

如何使用servlet下载图片_第1张图片

 

总结:1.下载需要注意的地方

1.1中文文件名乱码问题(不同浏览器乱码)

 edge: 

URLEncoder.encode(filename, "UTF-8")
火狐
前缀:=?UTF-8?B?
中间:new String(Base64.encodeBase64(filename.getBytes()),"UTF-8")
后缀:?=

火狐示范:

注意:Base64.encodeBase64这里是导入binary的包
response.setHeader("content-Disposition", "attachment;filename==?UTF-8?B?"+new String(Base64.encodeBase64(filename.getBytes()),"UTF-8")+"?=")

2.attachment;filename 中间是分号,而不是冒号(如果是冒号下载的是Servlet,而不是图片,我之前犯过的错误。。)

如何使用servlet下载图片_第2张图片

3.len=input.read(bs) 从输入流中读取bs个字节,如果读取完len=-1,未读取完len !=-1

如何使用servlet下载图片_第3张图片

你可能感兴趣的:(servlet)