22.SpringMVC文件下载的两种方式

 

servlet 里边的下载很多小伙伴应该都很熟悉,用 HttpServletResponse 往出写即可,当然更多时候我们使用 apache 上的开源工具类 commons-io 来实现,核心代码如下:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String fileName = req.getParameter("file");
    String downloadFolder = req.getServletContext().getRealPath("/WEB-INF/download");
    File file = new File(downloadFolder, fileName);
    resp.addHeader("content-disposition",
            "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
    IOUtils.copy(new FileInputStream(file), resp.getOutputStream());
}

由于 SpringMVC 默认支持的参数类型就有 HttpServletResponse,因此我们也可以利用上面的代码来实现在 SpringMVC 中的下载,即在 Controller 中定义一个方法,返回值为 void,方法有一个参数为 HttpServletResponse,方法内容和上面代码类似,这种方式整体来说还是换汤不换药,还是 Servlet 中的老一套,SpringMVC 中针对下载有专门的方案,即ResponseEntity。使用 ResponseEntity,我们可以向前端返回一段二进制数据,代码如下:

@RequestMapping(value = "/exportEmp", method = RequestMethod.GET)
public ResponseEntity<byte[]> exportEmp() {
    return PoiUtils.exportEmp2Excel(empService.getAllEmployees());
}
public class PoiUtils {

    public static ResponseEntity<byte[]> exportEmp2Excel(List<Employee> emps) {
        HttpHeaders headers = null;
        ByteArrayOutputStream baos = null;
        try {
            //生成Excel,出于篇幅考虑,这里省略掉,小伙伴可以直接在源码中查看
            headers = new HttpHeaders();
            headers.setContentDispositionFormData("attachment", new String("员工表.xls".getBytes("UTF-8"), "iso-8859-1"));
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            baos = new ByteArrayOutputStream();
            workbook.write(baos);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);
    }
}

在返回给前端的 ResponseEntity 中指明返回的数据类型,然后告诉浏览器这个数据以下载的方式处理等等,为了防止乱码,需要对文件名进行编码。

扫码关注微信公众号 江南一点雨,回复 2TB,获取超 2TB Java 学习教程~

喜欢这篇文章吗?扫码关注公众号【江南一点雨】【江南一点雨】专注于 SPRING BOOT+微服务以及前后端分离技术,每天推送原创技术干货,关注后回复 JAVA,领取松哥为你精心准备的 JAVA 干货!

本文遵守 Attribution-NonCommercial 4.0 International 许可协议。 Attribution-NonCommercial 4.0 International