一、题目:实现文件下载的封装
二、设计思路:通过io流中学习的文件读取输出,结合servlet中的响应,完成文件下载的封装,在使用时通过getParameter()方法来获取path,最终完成下载。
三、实现代码:
/**
* 实现文件下载
*/
public class FileTools {
public static void download(String path,HttpServletResponse response) throws IOException {
//根据给定的路径获取文件对象(需要被传输到客户端的文件)
File file = new File(path);
String name = file.getName();
// 1.获取需要传输的文件的输入流
InputStream is = new FileInputStream(path);
// 2.获取response对象的输出流
OutputStream os = response.getOutputStream();
// 将文件名使用URL编码,防止客户端下载出现乱码
name = URLEncoder.encode(name, "utf-8");
// 设置响应头的响应内容类型
response.setHeader("content-disposition", "inline;filename" + name);
// 3.读取输入流中的内容,并通过输出流输出
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
is.close();
os.close();
}
}
/**
* Servlet implementation class DownloadServlet
*/
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("fname");
//获取需要传输到客户端的文件路径
String path = "d:/fileserver/"+File.separator+name;
FileTools.download(path, response);
}
}