Spring 框架下 Java 实现简单文件下载

719 阅读1分钟

前言

文件下载上传本质上是文件的读写,核心是 Java 的流操作。

下载文件简单示例

Controller 层接口

@GetMapping("/downloadFile")
public void downloadTemplate(HttpServletResponse response) {
    this.fileService.downloadFile(response);
}

Service 层具体实现

/**
 * 下载测试文件
 *
 * @param response 响应
 */
@Override
public void downloadFile(HttpServletResponse response) {
    // 重置 response
    response.reset();
    response.setContentType("application/octet-stream;charset=utf-8");
    try {
        // 在响应头设置下载文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("质量规则-导入模板.xlsx", "UTF-8"));
        try (final InputStream inputStream = new ClassPathResource("template/test.txt").getInputStream();
             final ServletOutputStream outputStream = response.getOutputStream()
        ) {
            final byte[] bytes = new byte[2048];
            int len;
            while ((len = inputStream.read(bytes)) > 0) {
                outputStream.write(bytes, 0, len);
            }
        }
    } catch (UnsupportedEncodingException e) {
        log.error("设置响应头出错", e);
    } catch (IOException e) {
        log.error("下载测试文件出错", e);
    }
}
  • 这种设置下载文件名的方式打包 jar 文件部署后下载文件的名字如果含有中文也是正常的,用 postman 测试下载的文件名会乱码。
  • 待下载的文件存放路径为 resource/template/test.txt