欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式

 更新時(shí)間:2024年05月06日 09:45:38   作者:Mr-Wanter  
這篇文章主要介紹了OpenFeign實(shí)現(xiàn)微服務(wù)間的文件下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

項(xiàng)目場(chǎng)景

微服務(wù)通過(guò)openfeign獲取文件流

問(wèn)題描述

微服務(wù)通過(guò)openfeign獲取文件流,消費(fèi)端獲取的inputSteam=null,無(wú)法獲取到文件流信息

解決方案

file服務(wù)(提供者)

根據(jù)附件id,獲取附件路徑下載

    @ApiOperation(value = "附件下載")
    @RequestMapping(value = "/file/download/v1", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public void down(HttpServletResponse response,@CustomJSONBody Object object) {
        Map<String, String> map = (Map) object;
        String fileId = map.get("fileId");
        String[] fileInfos = attachmentService.findById(fileId);
        InputStream in = null;
        try {
            String filePath = fileUploadDir + fileInfos[1];
            if (File.separator.equals("/")) {
                filePath = filePath.replaceAll("\\\\", File.separator);
            } else if (File.separator.equals("\\\\")) {
                filePath = filePath.replaceAll("/", File.separator);
            }
            in = new FileInputStream(filePath);
            OutputStream out = response.getOutputStream();
            byte buffer[] = new byte[1024];
            int length = 0;
            while ((length = in.read(buffer)) >= 0){
                out.write(buffer,0,length);
            }
        } catch (Exception e) {
            logger.error("附件下載異常", e);
        } finally {
            if(in != null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

feign

    @RequestMapping(value = "/file/download/v1", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Response down(@CustomJSONBody Object object);

業(yè)務(wù)服務(wù)(消費(fèi)者)

將附件打包zip文件下載(附全部zip打包相關(guān)代碼,可直接看最后一個(gè)執(zhí)行壓縮的方法)

public void zipExcelExport(DisasterHistoryExportDTO dto, HttpServletResponse response) {
        List<String> ids = dto.getList().stream().map(DisasterExpandPO::getFileId).collect(Collectors.toList());
        List<AttachmentPO> attachmentPOList = attachmentDao.findAllById(ids);
        if (CollectionUtils.isNotEmpty(attachmentPOList)) {
            try {
                response.reset();
                // 設(shè)置response的Header
                String exportName = URLEncoder.encode(dto.getFileName() + ".zip", "utf-8");
                response.setContentType("application/octet-stream");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-Disposition", "attachment; filename=" + exportName);
                response.setHeader("FileName", exportName);
                response.setHeader("Access-Control-Expose-Headers", "FileName");
                OutputStream out = response.getOutputStream();
                excelsToZip(out, attachmentPOList);
                out.close();
            } catch (IOException ex) {
                throw new BusinessException("導(dǎo)出壓縮包失敗");
            }
        }
    }     
    /**
     * 打壓縮包導(dǎo)出
     */
    private void excelsToZip(OutputStream out, List<AttachmentPO> list) throws RuntimeException {
        ZipOutputStream zos = null;
        try {
            zos = new ZipOutputStream(out);
            compressExcel(zos, list);
        } catch (Exception e) {
            throw new RuntimeException("zip error from ZipUtils", e);
        } finally {
            if (zos != null) {
                try {
                    zos.close();
                } catch (IOException e) {
                    throw new BusinessException("關(guān)閉zip輸出流失敗");
                }
            }
        }
    }
     /**
     * 執(zhí)行壓縮
     */
    private void compressExcel(ZipOutputStream zos, List<AttachmentPO> list) {
        if (CollectionUtils.isNotEmpty(list)) {
            for (AttachmentPO item : list) {
                byte[] buf = new byte[BUFFER_SIZE];
                Map<String, String> map = new HashMap<>();
                map.put("fileId", item.getAttachId());
                Response response = attachmentCilent.down(map);
                Response.Body body = response.body();
                try {
                    InputStream in = body.asInputStream();
                    zos.putNextEntry(new ZipEntry(item.getOldName()));
                    int len;
                    while ((len = in.read(buf)) != -1) {
                        zos.write(buf, 0, len);
                    }
                    zos.closeEntry();
                    in.close();
                    in.close();
                } catch (IOException e) {
                    throw new BusinessException("執(zhí)行壓縮失敗");
                }
            }
        }
    }

核心代碼

  • 提供者:返回void,HttpServletResponse 寫入
  • feign:應(yīng)用提供者接口,返回改為Response(用feign.Response來(lái)接收)
  • 消費(fèi)者:調(diào)用feign,轉(zhuǎn)為InputStream
Response response = attachmentCilent.down(map);
Response.Body body = response.body();
InputStream in = body.asInputStream();

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java開(kāi)發(fā)之ssm三大框架整合

    Java開(kāi)發(fā)之ssm三大框架整合

    SSM框架是spring?MVC?,spring和mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式,將整個(gè)系統(tǒng)劃分為表現(xiàn)層,controller層,service層,DAO層四層,使用spring?MVC負(fù)責(zé)請(qǐng)求的轉(zhuǎn)發(fā)和視圖管理,spring實(shí)現(xiàn)業(yè)務(wù)對(duì)象管理,mybatis作為數(shù)據(jù)對(duì)象的持久化引擎
    2022-05-05
  • Servlet第一個(gè)項(xiàng)目的發(fā)布(入門)

    Servlet第一個(gè)項(xiàng)目的發(fā)布(入門)

    這篇文章主要介紹了Servlet第一個(gè)項(xiàng)目的發(fā)布,下面是用servlet實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的web項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • JAVA匿名內(nèi)部類語(yǔ)法分析及實(shí)例詳解

    JAVA匿名內(nèi)部類語(yǔ)法分析及實(shí)例詳解

    這篇文章主要介紹了JAVA匿名內(nèi)部類語(yǔ)法分析及實(shí)例詳解,匿名內(nèi)部類可以使你的代碼更加簡(jiǎn)潔,它與局部類很相似,不同的是它沒(méi)有類名,如果某個(gè)局部類你只需要用一次,那么你就可以使用匿名內(nèi)部類。對(duì)此感興趣的可以了解一下
    2020-07-07
  • SpringBoot2整合Drools規(guī)則引擎及案例詳解

    SpringBoot2整合Drools規(guī)則引擎及案例詳解

    這篇文章主要介紹了SpringBoot2整合Drools規(guī)則引擎及案例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java解析excel文件的方法

    java解析excel文件的方法

    這篇文章主要介紹了java解析excel文件的方法,這里整理相關(guān)的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 淺談UUID生成的原理及優(yōu)缺點(diǎn)

    淺談UUID生成的原理及優(yōu)缺點(diǎn)

    UUID是一套用于生成全局唯一標(biāo)識(shí)符的標(biāo)準(zhǔn),也被稱為GUID?(Globally?Unique?Identifier),通過(guò)使用UUID可以在分布式系統(tǒng)中生成唯一的?ID,UUID的生成方式有多種,本文將詳細(xì)講解?UUID?的生成原理、特性、實(shí)用場(chǎng)景以及優(yōu)缺點(diǎn)
    2023-06-06
  • spring中的注解事務(wù)演示和添加步驟詳情

    spring中的注解事務(wù)演示和添加步驟詳情

    這篇文章主要介紹了spring中的注解事務(wù)演示和添加步驟詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境全過(guò)程

    Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境全過(guò)程

    眾所周知Ubuntu是一種基于Linux的操作系統(tǒng),它提供了一個(gè)穩(wěn)定、安全和易于使用的環(huán)境,下面這篇文章主要給大家介紹了關(guān)于Linux?Ubuntu系統(tǒng)下配置JDK環(huán)境、MySQL環(huán)境的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 深入理解happens-before和as-if-serial語(yǔ)義

    深入理解happens-before和as-if-serial語(yǔ)義

    本文大部分整理自《Java并發(fā)編程的藝術(shù)》,溫故而知新,加深對(duì)基礎(chǔ)的理解程度。下面可以和小編來(lái)一起學(xué)習(xí)下
    2019-05-05
  • IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在

    IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在

    這篇文章主要介紹了IDEA2020.1啟動(dòng)SpringBoot項(xiàng)目出現(xiàn)java程序包:xxx不存在,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06

最新評(píng)論