spring boot feign文件下载

180 阅读1分钟

spring boot feign文件下载

feign client

返回 feign.Response 对象

@RequestMapping(value = "/open/itemPlan/downDataFile", method = RequestMethod.GET)
Response downDataFile(@SpringQueryMap ProductItemPlanDownFileRequest request);

具体实现controller

按照正常文件下载方式进行编写

@RequestMapping(value = "/open/itemPlan/downDataFile", method = RequestMethod.GET)
public void downDataFile(@SpringQueryMap ProductItemPlanDownFileRequest request, HttpServletResponse httpServletResponse) {
    request.setHttpServletResponse(httpServletResponse);
    service.downDataFile(request);
}

文件下载Service实现

/**
 * 下载附件
 *
 * @param request ProductItemPlanDownFileRequest
 */
@Override
public void downDataFile(ProductItemPlanDownFileRequest request) {
    ProductItemPlanModel model = repository.findById(request.getId()).orElseThrow(() -> new NotFoundDaoException("数据不存在"));
    Page<ProductItemPlanUserModel> page = listUserPage(model.getId(), model.getCount());
    List<ProductItemPlanUserDTO> dtoList = new ArrayList<>();
    if(page != null && page.getContent().size() > 0) {
        page.getContent().forEach(c-> {
            ProductItemPlanUserDTO dto = new ProductItemPlanUserDTO();
            BeanUtils.copyProperties(c, dto);
            dtoList.add(dto);
        });
    }
    if(dtoList.size() > 0) {
        String fileName = "";
        try {
            fileName = model.getId() + "_" +  URLEncoder.encode("玩家id", "UTF-8") + ".csv";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        request.getHttpServletResponse().setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        request.getHttpServletResponse().setCharacterEncoding("utf-8");
        request.getHttpServletResponse().setHeader("Content-disposition", "attachment;filename=" + fileName);
        try {
            EasyExcel.write(request.getHttpServletResponse().getOutputStream(), ProductItemPlanUserDTO.class).excelType(ExcelTypeEnum.CSV).sheet("玩家id").doWrite(dtoList);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }
    return;
}

外部服务调用

/**
 * 附件下载
 *
 * @param request 请求参数
 * @return ResultVO
 */
@RequestMapping(value = "/downDataFile/{id}", method = RequestMethod.GET)
public void downDataFile(@PathVariable("id") Integer id, ProductItemPlanDownFileRequest request, HttpServletResponse response) throws IOException {
    request.setId(id);
    // 调取原下载服务的接口
    Response feignResponse = client.downDataFile(request);
    InputStream inputStream = null;
    BufferedInputStream bufferedInputStream = null;
    OutputStream outputStream = null;
    try {
        response.setContentType("application/octet-stream;charset=utf-8");
        response.setHeader("Content-Disposition", feignResponse.headers().get("Content-disposition").toString().replace("[","").replace("]",""));
        inputStream = feignResponse.body().asInputStream();
        bufferedInputStream = new BufferedInputStream(inputStream);
        outputStream = response.getOutputStream();
        byte[] buffer = new byte[1024 * 1024 * 5];
        int len;
        while ((len = bufferedInputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (inputStream!=null){
            inputStream.close();
        }
        if (outputStream!=null){
            outputStream.close();
        }
        if (bufferedInputStream!=null){
            bufferedInputStream.close();
        }
    }
}