文件下载
- 通过IDEA编写
- 通过JavaWeb(JSP)实现文件下载
- 使用的是Maven导包
一、通过后端下载
/**
* 作者:沈公子
* 日期:2022/7/15 - 12:29
* 作用:文件下载 Servlet
* 需求:
*/
@WebServlet(name = "FileServlet", value = "/FileServlet")
public class FileDownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、要获取下载文件的路径,需要下载的路径,resources 目录中需要有这个文件,才可以下载
// String realPath = "E:\\Java\\JavaDemo\\JavaWeb\\demo05_1\\target\\classes\\1.png"; // 需要先编译
String realPath = "E:\\Java\\JavaDemo\\JavaWeb\\demo05_1\\src\\main\\resources\\1.png";
// String realPath = "E:\\NativeFile\\Pictures\\测试\\1.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);
// 5、创建缓冲区
byte[] buffer = new byte[1024];
// 6、判断释放读取完毕
int len = 0;
// 7、获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 8、将 FileOutputStream 流写入到buffer缓冲区,使用OutputStream缓冲区中的数据输出到客户端
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
// 不需要关闭流,随着响应结束,response对象销毁,由服务器关闭
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
二、前端和后端交互下载
前端代码
<a href="http://localhost:8080/demo05_1_war/DownloadServlet?filename=1.png">
文件下载
</a>
后端代码
@WebServlet(name = "DownloadServlet", value = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 获取要下载的文件名称
String filename = request.getParameter("filename");
// 下载文件所在目录,在 webapp 下创建该目录 download,并放置要下载的内容
String folder = "/download/";
// 通知浏览器以下载的方式打开
response.addHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
// 通过文件流读取文件
InputStream in = getServletContext().getResourceAsStream(folder + filename);
OutputStream out = response.getOutputStream();
/*byte[] buffer = new byte[1024];
int len;
// 循环输出流中的数据
while ((len=in.read(buffer)) != -1){
out.write(buffer,0,len);
}*/
/*
<!--io流读取-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
*/
// 使用工具栏,实现流的copy
IOUtils.copy(in,out);
// 不需要关闭流,随着响应结束,response对象销毁,由服务器关闭
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}