第一种方法直接在前端使用超链接,也就是a标签
浏览器不能识别会直接下载(像压缩文件不能直接下载),浏览器能识别,想要下载加一个download属性。download可以不写任何信息。
首先在web下建一个文件,放需要下载的文件
前端代码:
<body> <a href="download/8SR]W6{XY95QAENBX01XGBD.png">图片文件</a> <a href="download/111.txt">文本文件</a> <!--浏览器不能识别的文件--> <a href="download/111.zip">压缩文件</a> <hr> <a href="download/8SR]W6{XY95QAENBX01XGBD.png" download="java.png">图片文件</a> <a href="download/111.txt" download>文本文件</a> </body> </html>
启动后点击页面中的超链接就可以下载。
第二种方式:后台实现下载
1.
需要通过
response.setContentType
方法设置
Content-type
头字段的值, 为浏览器无法使用某
种方式或激活某个程序来处理的
MIME
类型,例 如
"application/octet-stream"
或
"application/x-
msdownload"
等。
2.
需要通过
response.setHeader
方法设置
Content-Disposition
头的值 为
"attachment;filename=
文件名
"
3.
读取下载文件,调用
response.getOutputStream
方法向客户端写入附件内容。
@WebServlet("/downloadServlet") public class DownloadServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("-----文件下载-------"); //设置请求的编码格式 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //获取参数(得到要下载的文件名,前端传来的) String fileName = request.getParameter("fileName"); //参数的非空判断 trim();去除字符串的前后空格 if(fileName == null || "".equals(fileName.trim())){ response.getWriter().write("请输入要下载的文件名"); response.getWriter().close(); return; } //得到图片存放的路径 String path = request.getServletContext().getRealPath("/download/"); //通过路径得到file对象 File file = new File(path + fileName); if(file.exists() && file.isFile()){ //设置响应类型(浏览器无法使用某种方式或激活某个程序来处理MIME类型) response.setContentType("application/x-msdownload"); //设置响应头 response.setHeader("Content-Disposition","attachment;filename"+fileName); //得到file文件输入流 InputStream in = new FileInputStream(file); //得到字节输出流 ServletOutputStream out = response.getOutputStream(); //定义byte数组 byte[] bytes = new byte[1024]; //定义长度 int len = 0; //循环输出 while((len = in.read(bytes)) != -1){ //输出 out.write(bytes,0,len); } //关闭资源 out.close(); in.close(); }else{ response.getWriter().write("文件不存在,请重试!"); response.getWriter().close(); } } }
----------------------------------------------------------------
简化的代码
@WebServlet("/downloadServlet02") public class DownLoadSimple extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置请求的编码 request.setCharacterEncoding("UTF-8"); // 获取文件下载路径 String path = getServletContext().getRealPath("/"); // 获取要下载的文件名 String name = request.getParameter("fileName"); // 通过路径得到file对象 File file = new File(path + name); // 判断file对象是否存在,且是否是一个标准文件 if (file.exists() && file.isFile()) { // 设置响应类型 (浏览器无法使用某种方式或激活某个程序来处理的类型) response.setContentType("application/x-msdownload"); // 设置头信息 response.setHeader("Content-Disposition", "attachment;filename=" + name); // 得到输入流 InputStream is = new FileInputStream(file); // 得到输出流 ServletOutputStream os = response.getOutputStream(); // 定义byte数组 byte[] car = new byte[1024]; // 定义长度 int len = 0; // 循环 输出 while ((len = is.read(car)) != -1) { os.write(car, 0, len); } // 关闭流 释放资源 os.close(); is.close(); } else { System.out.println("文件不存在,下载失败!"); } } }