本例中实现了一个下载图片的页面,点击不同的按钮可以下载不同的图片
实例中用到的图片文件在目录中如下所示:
首先编写jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Photos</title> <style type="text/css"> #dog{ background: url("./Photos/dog.jpg"); background-size: contain; width: 200px; height:200px; } #cat{ background: url("./Photos/cat.jpg"); background-size: contain; width: 200px; height:200px; } </style> </head> <body> <div id = "dog"> </div> <a href="">点我下载</a> <div id = "cat"> </div> <a href="">点我下载</a> </body> </html>
页面效果如图所示:
接下来需要编写Servlet,实现文件下载功能
这里我们只编写一个Servlet,根据提交请求中的信息向浏览器响应不同的下载
规定一个photoNum参数,photoNum = 1表示下载第一张图片,photoNum = 2 表示下载第二张图片
修改jsp文件中的a标签属性:
<div id = "dog"> </div> <a href="/test/Download?photoNum=1">点我下载</a> <div id = "cat"> </div> <a href="/test/Download?photoNum=2">点我下载</a>
继续编写Servlet的doGet方法:
首先
获取请求行中的图片编号
String photoNum = request.getParameter("photoNum");
获得文件名:
String filename = ""; if(photoNum.equals("1")) { filename = "dog.jpg"; } if(photoNum.equals("2")) { filename = "cat.jpg"; }
根据文件名获得文件字节输入流对象,这里需要使用上下文对象来获取该图片在服务器上的真实地址:
FileInputStream fis = new FileInputStream(context.getRealPath("/Photos/"+filename));
输入流对象有了,加下来需要从响应对象中获取输出流,并且需要设置浏览器不要解析该图片,要下载该图片
ServletOutputStream sos = response.getOutputStream(); //通过上下文对象的getMime方法,传入文件路径,获取文件的类型 response.setContentType(context.getMimeType("/test/Photos/"+filename)); response.setHeader("Content-Disposition","attachment;filename="+filename);
复制文件(下载过程其实就是从服务器把一个文件复制到客户端):
int length = 0; byte[] buffer = new byte[64]; while((length = fis.read(buffer))!=-1) { sos.write(buffer,0,length); } fis.close();
运行测试: