Spring Boot Rest Service 下载文件

2017/04/20

download a file from Spring boot rest service

前言

这次总结一下文件下载,一般的文件下载是没问题的,设置一下HttpServletResponse,直接通过浏览器来下载。

resp.setContentType("application/x-msdownload"); resp.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

开发中,需要从后端服务器下载创建的Excel文件。项目前后端是分离的,这个比较麻烦,不知道前后端怎么交互了。

之前想到的一种方案是:先创建成功Excel,通过输出流写到服务器一个固定路径下面,通过超链接来下载,这个是没问题的。这种方案是需要额外提供一个文件服务器,这个就比较麻烦了。

最好的方案是直接把文件以流的形式输出到浏览器。

在前端架构大神的帮助下总算解决了,直接上代码。。。

后端代码

创建Excel

Apache提供的POI包可以生成Excel,看官方提供的示例。这里创建个简单的Excel文件。

	public static Workbook createExcel() {
		//new HSSFWorkbook() make xls
		//new XSSFWorkbook() make xlsx
		Workbook xlsx = new XSSFWorkbook();

		Sheet sheet = xlsx.createSheet();
		Row row = sheet.createRow(1);
		Cell cell0 = row.createCell(0);
		cell0.setCellValue("0");
		Cell cell1 = row.createCell(1);
		cell1.setCellValue("1");
		Cell cell2 = row.createCell(2);
		cell2.setCellValue("2");

		return xlsx;
	}

下载

@RestController
@RequestMapping("/download")
public class DownloadController {

	@RequestMapping(value = "/file", method = RequestMethod.GET)
	public ResponseEntity<Resource> downloadFile() {
		ByteArrayOutputStream bos = null;
		String filename = "测试.xlsx";
		try {
			Workbook workbook = createExcel();
			bos = new ByteArrayOutputStream();
			workbook.write(bos);
			workbook.close();

			HttpHeaders headers = new HttpHeaders();
			headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
			headers.add("Pragma", "no-cache");
			headers.add("Expires", "0");
			headers.add("charset", "utf-8");
			//设置下载文件名
			filename = URLEncoder.encode(filename, "UTF-8");
			headers.add("Content-Disposition", "attachment;filename=\"" + filename + "\"");

			Resource resource = new InputStreamResource(new ByteArrayInputStream(bos.toByteArray()));

			return ResponseEntity.ok().headers(headers).contentType(MediaType.parseMediaType("application/x-msdownload")).body(resource);

		} catch (IOException e) {
			if (null != bos) {
				try {
					bos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		return null;
	}
}

前端代码


$scope.download = function () {
    $http({
        method: 'GET',
        url: 'http://localhost:9090/download/file',
        params: { name: name },
        responseType: 'arraybuffer'
    }).then(function (result) {
        var linkElement = document.createElement('a');
        try {
            var blob = new Blob([result.data], { type: 'application/octet-stream' });
            var url = window.URL.createObjectURL(blob);
            linkElement.setAttribute('href', url);
            linkElement.setAttribute("download", 'filename');
            var clickEvent = new MouseEvent("click", {
                "view": window,
                "bubbles": true,
                "cancelable": false
            });
            linkElement.dispatchEvent(clickEvent);
        } catch (ex) {
            console.log(ex);
        }
    });
}

测试

接口测试,直接通过浏览器访问http://localhost:9090/download/file

这里写图片描述

这次也是涨姿势了。。。总结一下留着备用,希望能帮到有需要的同学。

参考

download a file from Spring boot rest service Return file from Spring @Controller having OutputStream Problems using @Consumes(MediaType.APPLICATION_JSON) in RESTful web service


作者:Wuxinshui
出处:http://wuxinshui.github.io
版权归作者所有,转载请注明出处

Post Directory