通过浏览器客户端访问Servlet,实现存储于Tomcat服务器上的资源文件的预览效果,主要结合ServletResponse与IO流文件操作实现。原理图示如下:
指定文件目录
首先新建项目servletDemo2,指定用于存放文件的路径为:
servletDemo2/files/
编写Servlet类与注解配置
通过继承HttpServlet,重写doGet()和doPost()方法,实现文件下载功能,此处约定使用GET请求,请求参数为:fname。
package com.xwd.demo;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
* @ClassName FilePreView
* @Description: com.xwd.demo
* @Auther: xiwd
* @Date: 2022/2/4 - 02 - 04 - 0:13
* @version: 1.0
*/
@WebServlet(
name = "fileprew",
value = {"/fileprew"}
)
public class FilePreView extends HttpServlet {
//properties
private static final String FILE_DIR="files";
// 设定输出的类型
//methods
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doGet(req, resp);
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
req.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
//解析参数
String fname = req.getParameter("fname");
System.out.println(fname);
//获取ServletContext对象
ServletContext servletContext = req.getServletContext();
//获取文件的绝对路径
String realPath = servletContext.getRealPath(FILE_DIR + File.separator + fname);
String mimeType = servletContext.getMimeType(fname);
//获取文件的媒体类型
resp.setContentType(mimeType);
//输出文件
InputStream is=new FileInputStream(realPath);
OutputStream os = resp.getOutputStream();
BufferedOutputStream bos=new BufferedOutputStream(os);
byte[] buffer=new byte[1024];
int len=-1;
while ((len = is.read(buffer)) != -1) {
bos.write(buffer,0,len);
}
//关闭流
bos.flush();
bos.close();
is.close();
}
}