用到的知识:
1. 利用response传输文件,文件的输入输出流
2. 页面刷新
3. 设计图片
4. 不让浏览器缓存
5. 设置固定位随机数
package com.sn.fileServlet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; public class fileServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1 获取下载文件的路径 //String realPath = this.getServletContext().getRealPath("/sy.jpg"); String realPath = "D:\\java\\javaweb-02-servlet\\response\\target\\classes\\sy.png"; System.out.println("下载的文件:"+realPath); //2 下载的文件名是啥 String filename = realPath.substring(realPath.lastIndexOf("\\") + 1); //3 想办法让浏览器能够支持下载我们需要的东西 resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8")); //4 获取下载文件的输入流 // FileInputStream in = new FileInputStream(realPath); FileInputStream in = new FileInputStream(realPath); //5 创建缓冲区 int len=0; byte[] buffer = new byte[1024]; //6 获取outputstream对象 ServletOutputStream out = resp.getOutputStream(); //7 将 FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端 while ((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); } }
package com.sn.fileServlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; public class ImageServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //让浏览器3秒自动刷新一次 resp.setHeader("refresh", "3"); //内存中创建一个图片 BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB); //得到图片 Graphics2D g = (Graphics2D) image.getGraphics();//笔 //设置图片的背景颜色 g.setColor(Color.WHITE); g.fillRect(0, 0, 80, 20); //给图片写数据 g.setColor(Color.BLUE); g.setFont(new Font(null,Font.BOLD,20)); g.drawString(makeNum(),0,20); //告诉浏览器,这个请求用图片的方式打开 resp.setContentType("image/png"); //网站存在缓存,不让浏览器缓存 resp.setDateHeader("expires",-1); resp.setHeader("Cache-Control","no-cache"); resp.setHeader("Pragma","no-cache"); //把图片写给浏览器 ImageIO.write(image,"png",resp.getOutputStream()); } //生成随机数 private String makeNum() { Random random = new Random(); String num = random.nextInt(9999999) + ""; StringBuffer sb = new StringBuffer(); for (int i = 0; i < 7 - num.length(); i++) { sb.append("0"); //生成的数如果不够7位,就用0填充 } num = sb.toString() + num; return num; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <servlet> <servlet-name>xz</servlet-name> <servlet-class>com.sn.fileServlet.fileServlet</servlet-class> </servlet> <!-- servlet的请求路径--> <servlet-mapping> <servlet-name>xz</servlet-name> <url-pattern>/xz</url-pattern> </servlet-mapping> <servlet> <servlet-name>image</servlet-name> <servlet-class>com.sn.fileServlet.ImageServlet</servlet-class> </servlet> <!-- servlet的请求路径--> <servlet-mapping> <servlet-name>image</servlet-name> <url-pattern>/image</url-pattern> </servlet-mapping> </web-app>