使用servlet完成文件下载和验证码

普通文件下载

@WebServlet(name = "DownloadServlet",urlPatterns = "/download")
public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 1.接收参数
        String filename = request.getParameter("filename");
        // 2.完成文件下载:
        // 2.1设置Content-Type头
        String type = this.getServletContext().getMimeType(filename);
        response.setHeader("Content-Type", type);
        // 2.2设置Content-Disposition头
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        // 2.3设置文件的InputStream.
        String realPath = this.getServletContext().getRealPath("/download/"+filename);
        InputStream is = new FileInputStream(realPath);
        // 获得response的输出流:
        OutputStream os = response.getOutputStream();
        int len = 0;
        byte[] b = new byte[1024];
        while((len = is.read(b))!= -1){
            os.write(b, 0, len);
        }
        is.close();
    }

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

中文文件下载

由于不同的浏览器下载中文文件时采用的编码格式是不一样的,所以要返回同意的解析格式

/**
 1. 文件下载的Servlet
 */
@WebServlet(name = "DownloadServlet",urlPatterns = "/download")
public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.接收参数
        String filename = new String(request.getParameter("filename"));
        System.out.println(filename);
        // 2.完成文件下载:
        // 2.1设置Content-Type头
        String type = this.getServletContext().getMimeType(filename);
        response.setHeader("Content-Type", type);
        // 2.3设置文件的InputStream.
        String realPath = this.getServletContext().getRealPath("/download/" + filename);

        // 根据浏览器的类型处理中文文件的乱码问题:
        String agent = request.getHeader("User-Agent");
        System.out.println(agent);
        if (agent.contains("Firefox")) {
            filename = base64EncodeFileName(filename);
        } else {
            filename = URLEncoder.encode(filename, "UTF-8");
        }

        // 2.2设置Content-Disposition头
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);

        InputStream is = new FileInputStream(realPath);
        // 获得response的输出流:
        OutputStream os = response.getOutputStream();
        int len = 0;
        byte[] b = new byte[1024];
        while ((len = is.read(b)) != -1) {
            os.write(b, 0, len);
        }
        is.close();
    }

    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                    .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

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

文件下载

  • 不建议也肯定没有人使用这种方式,麻烦,没屁用,如果有想使用的可以直接复制
  • 分析在这里插入图片描述
  1. 页面代码
<form action="">
   用户名<input type="text" name="username"><br/>
   密码<input type="password" name="password"><br/>
   验证码<input type="text" name="checkCode" style="width: 50px">
   <img src="/day15/checkcode" onclick="changeImg(this)"><br/>
   <input type="submit" value="注册">
   
</form>

<script type="text/javascript">
   
   function changeImg(obj){
      //修改修改src
      obj.src = "/day15/checkcode?xx="+new Date().getTime();
   }
</script>
  1. jav代码
@WebServlet(name = "CheckcodeServlet",urlPatterns = "/checkcode")
public class CheckcodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //  创建画布
        int width = 120;
        int height = 40;
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //  获得画笔
        Graphics g = bufferedImage.getGraphics();
        //  填充背景颜色
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        //  绘制边框
        g.setColor(Color.red);
        g.drawRect(0, 0, width - 1, height - 1);
        //  生成随机字符
        //  准备数据
        String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
        //  准备随机对象
        Random r = new Random();
        //  声明一个变量 保存验证码
        String code = "";
        //  书写4个随机字符
        for (int i = 0; i < 4; i++) {
            //  设置字体
            g.setFont(new Font("宋体", Font.BOLD, 28));
            //  设置随机颜色
            g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));

            String str = data.charAt(r.nextInt(data.length())) + "";
            g.drawString(str, 10 + i * 28, 30);

            //  将新的字符 保存到验证码中
            code = code + str;
        }
        //  绘制干扰线
        for (int i = 0; i < 6; i++) {
            //  设置随机颜色
            g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));

            g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
        }

        //  将验证码 打印到控制台
        System.out.println(code);

        //  将验证码放到session中
        request.getSession().setAttribute("code_session", code);

        //  将画布显示在浏览器中
        ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
    }

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

}

猜你喜欢

转载自blog.csdn.net/HongRi_/article/details/88291568