package com.xxx.file;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* @Author HPF
* @Date 2023/5/19 9:03
* description:
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("文件下载");
//1.设置请求的编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); //针对前端显示的文字乱码
//2. 下载文件= 路径+文件名
String fileName = request.getParameter("fileName");
//输入的文件名合法?
if (fileName == null || "".equals(fileName.trim())){
response.getWriter().write("请输入文件名");
response.getWriter().close();
}
String filePath = request.getServletContext().getRealPath("/download/");//可下载的文件资源路径
System.out.println("下载路径:"+filePath);
File file = new File(filePath + fileName);
//3.判断文件是否是文件类型
if (file.exists() && file.isFile()){
//设置响应类型
response.setContentType("application/octet-stream");
//设置响应头
response.setHeader("Content-Disposition","attachment;filename="+fileName);
//下载: 输入流、输出流
FileInputStream in = new FileInputStream(file);
ServletOutputStream out = response.getOutputStream(); //文件是字节输出流
int len = 0 ;
byte[] bytes = new byte[1024];
//in.read(bytes)相当于把字节读入到byte[]里
while (( len = in.read(bytes) ) != -1){
out.write(bytes,0,len);
}
out.close();
in.close();
}else {
response.getWriter().write("文件不合法,请重试");
response.getWriter().close();
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下载</title>
</head>
<body>
<form action="downloadServlet">
文件名: <input type="text" name="fileName" placeholder="请输入文件名">
<button>下载</button>
</form>
</body>
</html>
项目结构
1.当前项目路径
2.修改资源下载路径,如图。
注意 /s07/downlaod的/s07 是当前项目的路径,参考上图。
3.注意java代码 ,getRealPath()的参数,就是咱们自己创建的 download目录的名字
String filePath = request.getServletContext().getRealPath("/download/");//可下载的文件资源路径
4.基本就可以跑了。
弹出框下载
【注意】:上面忘记说了,java类名、包名自己创建,别直接copy哈;
前端页面名是download.html,自己新建,然后copy代码。
如果跑不通,记得删除out目录,再重启项目。
这不是重点,自己可以跑着玩玩,不用太担心。