背景:后端封装第三方的接口,供前端调用。其中有两个接口,一个是导出excel,一个是导入excel。
实现方式:不对流进行处理,相当于做一个中转站,直接把流抛出去。对于不同的文件格式,在请求头,和响应头的ContentType,进行指定。图片,文本,视频,音频也都是一样的道理。
@RestController
@RequestMapping("/api")
public class DemoApi {
@Resource
private HttpServletResponse response;
@Resource
private RestTemplate restTemplate;
@ApiOperation("导入")
@PostMapping("/import")
public String importKnowledge(
@RequestParam @ApiParam(value = ".xls文件", required = true) MultipartFile file
) throws Exception {
String url = "www.xxx.xxx";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
//excel的请求头
HttpHeaders excelHeader = new HttpHeaders();
excelHeader.setContentType(MediaType.parseMediaType("application/vnd.ms-excel"));
//如果是用spring 的MultipartFile接受,则加入下面这行, 取个随机文件名
excelHeader.setContentDispositionFormData("file", UUID.randomUUID() + ".xls");
HttpEntity<ByteArrayResource> excelPart = new HttpEntity<>(new ByteArrayResource(file.getBytes()), excelHeader);
form.add("file", excelPart);
//用HttpEntity封装整个请求报文
HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers);
String resp = "成功";
try {
resp = restTemplate.postForObject(url, files, String.class);
} catch (Exception e) {
e.printStackTrace();
}
//结果不对
return resp;
}
@ApiOperation("导出")
@GetMapping("/export")
public String exportKnowledge(
) throws Exception {
OutputStream outputStream = response.getOutputStream();
String url = "www.xxx.xxx";
String fileName = "导出";
byte[] result;
result = restTemplate.getForObject(url, byte[].class);
if (result.length == 0) {
throw new Exception("接口调用失败");
}
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
outputStream.write(result);
outputStream.flush();
return "成功";
}
}