restTemplate封装上传文件和下载文件接口

背景:后端封装第三方的接口,供前端调用。其中有两个接口,一个是导出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 "成功";
    }
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值