笔记:下载
这里是一段HTML代码,第一条是显示,第二条是下载
<td><img src="servlet/ShowPhotoServlet?id=${stu.id}" width="100px"/></td>
<td><a href="servlet/DownLoadServlet?id=${stu.id}">下载</a></td>
这里是显示图片的代码。1.获取学生的信息。2.获取图片文件。3.创建输出流和获取输出流。4.拷贝完成。
//1.获取学生的编号
int id = Integer.parseInt(request.getParameter("id"));
//2.调用业务层查询指定编号的学生信息(照片的名称、mime类型)
StudentService studentService = new StudentServiceImpl();
Student stu = studentService.findById(id);
String realName = stu.getRealName(); //yj.jpg
String uuidName = stu.getUuidName();
String mimeType = stu.getMimeType();
//3.不是转发和重定向 也不是Ajax请求,直接返回文件流
//3.1.创建输入流和输出流
InputStream is = new FileInputStream(new File("d:/upload",uuidName));//服务器端本地的文件
OutputStream os = response.getOutputStream();//客户端的浏览器
//3.2.使用输入流和输出流完成文件的下载(从服务器复制到客户端)
IOUtils.copy(is,os);
//3.3.关闭输入流和输出流
is.close();
os.close();
这里是下载图片的代码。1.获取学生的编号。2.获取文件。3.设置大小和类型。4.区分浏览器。5.设置为下载。6.拷贝流。
//获取学生编号
int id=Integer.parseInt(req.getParameter("id"));
//查询该学生的所有信息
StudentService studentService=new StudentServiceImpl();
Student student=studentService.findById(id);
//获取该文件的名字并获取该文件
File file=new File("d:/upload",student.getUuidName());
//这里是设置大小和文件的类型
resp.setContentLength((int)file.length());
resp.setContentType(student.getMimeType());
String realName=student.getRealName();
//这里是为了区分开是什么浏览器
String userAgent = req.getHeader("User-Agent").toLowerCase();
if(userAgent.indexOf("msie")>=0){
realName = URLEncoder.encode(realName, "utf-8");
}else{
realName = new String(realName.getBytes("utf-8"),"iso-8859-1");//???
}
//这里是可以直接下载文件,中间没有任何过程
resp.setHeader("Content-disposition", "attachment;filename="+realName);
//这里是会将图片放大
// resp.setHeader("Content-disposition", "inline;filename="+realName);
InputStream is = new FileInputStream(file); //读服务器端一个文件
OutputStream os = resp.getOutputStream(); //写到客户端
//3.2使用输入流和输出流完成复制操作(服务器端-----客户端)
IOUtils.copy(is, os);
//3.3关闭输入流是输出流
is.close();
os.close();