Spring——》feign下载文件

74 篇文章 6 订阅
19 篇文章 1 订阅

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】

一、服务提供者:good-house-push

1、ITmallSyncEsfCommunityController

方法的返回值一定是void,不要指定返回内容

public interface ITmallSyncEsfCommunityController {

    @ApiOperation(value = "根据批次号,下载同步二手房小区的错误日志列表")
    @GetMapping("/api/tmall/syncEsfCommunity/logList/downloadError/{batchNo}")
    void downloadErrorLogListByBatchNo(@PathVariable(name = "batchNo") String batchNo, HttpServletResponse response);
}

2、TmallEsfCommunitySyncController

@Slf4j
@Api(value = "同步二手房小区", tags = "同步二手房小区")
@RestController
public class TmallEsfCommunitySyncController implements ITmallSyncEsfCommunityController {

    @Autowired
    IEsfCommunitySyncService esfCommunitySyncService;

    @Override
    public void downloadErrorLogListByBatchNo(String batchNo, HttpServletResponse response) {
        esfCommunitySyncService.downloadErrorLogListByBatchNo(batchNo, response);
    }
}

3、IEsfCommunitySyncService

public interface IEsfCommunitySyncService {
    void downloadErrorLogListByBatchNo(String batchNo, HttpServletResponse response);
}

4、EsfCommunitySyncService

	@Slf4j
    @Service
    public class EsfCommunitySyncServiceImpl implements IEsfCommunitySyncService {
        @Override
        public void downloadErrorLogListByBatchNo(String batchNo, HttpServletResponse response) {
            List<EsfCommunitySyncLog> list = esfCommunitySyncLogService.selectList(new EsfCommunitySyncLog().setBatchNo(batchNo).setStatus(0));
            if (CollectionUtils.isEmpty(list)) {
                return;
            }
            List<EsfCommunitySyncLogDownloadRes> result = BeanCopyUtil.copyListProperties(list, EsfCommunitySyncLogDownloadRes::new);
            HttpServletResponseUtils.downloadExcel(response, EsfCommunitySyncLogDownloadRes.class, result, batchNo + ".xlsx", null);
        }
    }

5、HttpServletResponseUtils

public class HttpServletResponseUtils {
    public static void downloadExcel(HttpServletResponse response, Class clazz, Collection collection, String fileName, String sheetName) {

        Assert.notNull(response, "response 为空");
        Assert.notNull(clazz, "clazz 为空");
        Assert.notEmpty(collection, "collection 为空");
        Assert.hasText(fileName, "fileName 为空");

        if (!StringUtils.hasText(sheetName)) {
            sheetName = "sheet1";
        }

        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");


        try {
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String urlEncoderfileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");

            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + urlEncoderfileName + ".xlsx");
            EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(collection);
        } catch (IOException e) {
            log.error("downloadExcel 报错, 报错信息:{}", e);
            throw new RuntimeException(e);
        }
    }
}

二、服务消费者:house-platform-api

1、ITmallSyncEsfCommunityApi

方法的返回值设置为Response

@FeignClient(value = "${feign.client.config.good-house-push.name}", url = "${feign.client.config.good-house-push.url}", path = "${feign.client.inner.path}", configuration = CatFeignConfiguration.class)
public interface ITmallSyncEsfCommunityApi{

    @ApiOperation("根据批次号,下载同步二手房小区的错误日志列表")
    @GetMapping({"/api/tmall/syncEsfCommunity/logList/downloadError/{batchNo}"})
    Response downloadErrorLogListByBatchNo(@PathVariable(name = "batchNo") String batchNo);
}

2、TmallCityOpenController

将服务提供者的文件下载响应的响应体(文件内容)复制到服务消费者对外的文件下载响应体中

@Slf4j
@Api(tags = "天猫城市开通管理")
@RestController
@RequestMapping(value = "/tmall", produces = "application/json;charset=utf-8")
public class TmallController {

    @Autowired
    private ITmallSyncEsfCommunityApi tmallSyncEsfCommunityApi;
    
    @ApiOperation(value = "根据批次号,下载同步二手房小区的错误日志列表")
    @GetMapping("/cityopen/syncEsfCommunity/logList/downloadError/{batchNo}")
    void downloadErrorLogListByBatchNo(@PathVariable(name = "batchNo") String batchNo, HttpServletResponse response) {

        InputStream inputStream = null;
        try {
            Response serviceResponse = tmallSyncEsfCommunityApi.downloadErrorLogListByBatchNo(batchNo);
            Response.Body body = serviceResponse.body();
            inputStream = body.asInputStream();
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + batchNo + ".xlsx");
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
            int length = 0;
            byte[] temp = new byte[1024 * 10];
            while ((length = bufferedInputStream.read(temp)) != -1) {
                bufferedOutputStream.write(temp, 0, length);
            }
            bufferedOutputStream.flush();
            bufferedOutputStream.close();
            bufferedInputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值