第一种方法直接在前端使用超链接,也就是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 {@Overrideprotected 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 {@Overrideprotected 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("文件不存在,下载失败!");}} }