SpringCloud使用feign调用下载文件服务

消费者端

消费者端返回的类型是:ResponseEntity<byte[]>

/**
     * 下载手板树模板
     *
     * @return
     * @throws Exception
     */
    @RequestMapping(value = {"/HandboardAction/DownTreeTemplate"}, method = {RequestMethod.GET}, produces = {"application/json"})
    public ResponseEntity<byte[]> downTreeTemplate(HttpServletResponse dresponse) throws Exception {
        System.err.println("进来了》》》》》");
        ResponseEntity<byte[]> result = null;
        // feign文件下载
        Response response = TreeService.downTreeTemplate();
        Response.Body body = response.body();
        try (InputStream inputStream = body.asInputStream();) {
            // 构建输出流,将输入流写入到输出流
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[10240];
            while (true) {
                int len = inputStream.read(buf);
                if (len < 0) {
                    break;
                }
                bos.write(buf, 0, len);
            }
			//将输出流转为字节数组,通过ResponseEntity<byte[]>返回
            byte[] by = bos.toByteArray();
            System.err.println("接收到的文件大小为:" + by.length);
            //设置响应头
            HttpHeaders heads = new HttpHeaders();
            heads.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + new String("text.xls".getBytes(), "ISO8859-1"));
            heads.add(HttpHeaders.CONTENT_TYPE, "application/vnd.ms-excel;charset=utf-8");

            result = new ResponseEntity<byte[]>(by, heads, HttpStatus.OK);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.err.println("执行完毕》》》》》");
        return result;
    }

feign客户端

feign客户端的返回值需要注意,返回的类型为feign提供的Response,而不是:HttpServletResponse
import feign.Response;

/**
     * 下载模板
     * @return
     */
    @RequestMapping(value = "/downTreeTemplate",method = {RequestMethod.GET},produces = {"application/json"})
    Response downTreeTemplate();

提供者端

controller 层

@RequestMapping(value = {"/downTreeTemplate"}, method = {RequestMethod.GET})
    public void downTreeTemplate(HttpServletResponse response) {
        System.err.println("进来了》》》》》》");
        treeService.downTreeTemplate(response);
        System.err.println("执行完毕》》》》》》");
    }

service 层

/**
     * 下载手板树模板
     * 
     * @param response
     * @return
     */
    public void downTreeTemplate( HttpServletResponse response) {
        try {
            String filename = "text.xls";
            File downloadFile = new File("d:/com/"+filename);
            download(response,downloadFile,filename);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
/**
     * 下载处理
     *
     * @param response
     * @param downloadFile
     * @param fileName
     * @throws IOException
     */
    public static void download(final HttpServletResponse response, final File downloadFile, final String fileName) throws IOException {

        final File downloadFileTep = downloadFile;
        if (!downloadFileTep.exists()) {
            System.err.println("文件不存在》》》》》》》》》》");
            response.sendError(404, "File not found!");
            return;
        }

        try (final BufferedInputStream bufferStream = new BufferedInputStream(new FileInputStream(downloadFileTep))) {
            final byte[] buf = new byte[2048];
            int len;
            response.reset();
//            response.setContentType("application/x-msdownload");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;" +
                    "filename=" + new String(fileName.getBytes(), "ISO8859-1"));// 处理下载文件名乱码问题
            final OutputStream out = response.getOutputStream();
            int size =0;
            while ((len = bufferStream.read(buf)) > 0) {
                out.write(buf, 0, len);
                size += len;
                System.err.println("文件大小为:"+size);
            }
            bufferStream.close();
            out.close();
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值