使用openfeign调用下载流的文件不完整的替代方案

OpenFeign是一种声明式的Web服务客户端,它使得编写HTTP客户端变得更加简单和直观。它使用了注解方式来描述HTTP API,使得开发者可以使用Java接口来调用远程HTTP服务。

OpenFeign的核心特点包括:

  • 声明式API: 您可以使用注解声明要调用的远程API,然后使用Java接口调用它们。

  • 定制化接口: 您可以使用FeignBuilder类定制客户端接口的行为。

  • 支持编码器和解码器: Feign支持多种编码器和解码器,可以将请求和响应转换为Java对象。

  • 支持请求和响应压缩: OpenFeign支持gzip和deflate压缩算法。

  • 支持负载均衡: OpenFeign可以与负载均衡组件(如Ribbon)一起使用,以实现服务调用的负载均衡。

总之,OpenFeign是一个方便易用的Web服务客户端,可以帮助开发者快速、灵活地调用远程HTTP服务。

业务场景:获取下游服务的文件下载流,然后上传到minio,获取分享链接 

场景复现

代码

rpc类

@FeignClient(url = "ip:port", name = "infer")
public interface InferRpcService {@GetMapping(value = "/download", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)Response download(@RequestParam("text") String text);
}

调用类

@Slf4j
@Service
public class InferServiceImpl implements InferService {@Resourceprivate InferRpcService inferRpcService;@Resourceprivate MinioClient minioClient;@Overridepublic CommonResponse<String> tts(InferRequest inferRequest, HttpServletResponse response) {if (!CollectionUtils.isEmpty(userRecords) && Objects.nonNull(inferRequest) && StringUtils.isNoneEmpty(inferRequest.getText())) {try {Response transferred = inferRpcService.transferString(inferRequest.getText());Response.Body body = transferred.body();if (Objects.nonNull(body) && !body.isRepeatable()) {record.setTtsStatus(InferStatusConstant.SYNTHESIS_SUCCESSFUL);InputStream in = body.asInputStream();String filename = UUID.randomUUID().toString().replaceAll("-","");                    String sharedWavUrl = MinioUtils.uploadFile(minioClient, in, MinioConstant.VITS_BUCKET, allFilename);record.setSharedWavUrl(sharedWavUrl);return CommonResponse.ok(sharedWavUrl);}} catch (IOException e) {throw new RuntimeException(e);}}return CommonResponse.error("合成失败");}
}

工具类

@Slf4j
public class MinioUtils {public static String uploadFile(MinioClient minioClient, InputStream inputStream, String bucket, String filename) {try {log.info("返回的字节流大小: {}",inputStream.available());boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("public").build());if (!found) {minioClient.makeBucket(MakeBucketArgs.builder().bucket("public").build());}ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(filename).stream(inputStream, inputStream.available(), -1).contentType(InferStatusConstant.WAV_CONTENT_TYPE).build());String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().bucket(bucket).expiry(7 * 24 * 60 * 60).object(filename).method(Method.GET).build());log.info("分享地址:" + url);return url;} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException |XmlParserException e) {throw new RuntimeException(e);}}
}

现象

比如获取下又服务的音频的时候,会出现不完整的情况,我这边的现象是只有前五秒的音频

解决

借助restTemplate

代码

@Configuration
public class RestTemplateConfiguration {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {RestTemplate restTemplate = restTemplateBuilder.build();return restTemplate;}
}
public CommonResponse<String> download(InferRequest inferRequest, HttpServletResponse response, int a) {String url = "you_url";ResponseEntity<byte[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null,byte[].class);byte[] bytes = responseEntity.getBody();if (!ArrayUtils.isEmpty(bytes)) {record.setTtsStatus(InferStatusConstant.SYNTHESIS_SUCCESSFUL);String filename = UUID.randomUUID().toString().replaceAll("-", "");String allFilename = "/" + openId + "/" + filename + MinioConstant.WAV_SUFFIX;String sharedWavUrl = MinioUtils.uploadFile(minioClient, new ByteArrayInputStream(bytes), MinioConstant.VITS_BUCKET, allFilename);return CommonResponse.ok(sharedWavUrl);return CommonResponse.error("失败");}

下载没有问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一键创新 | 拓世法宝AI智能直播一体机激发房产自媒体创造力

在数字化时代&#xff0c;房产销售已然不再是传统的模式。随着社交媒体和自媒体的兴起&#xff0c;短视频直播成为房产自媒体营销的新风口。然而&#xff0c;行业也面临着诸多挑战&#xff0c;如何更好地利用新媒体拓展市场&#xff0c;提升自媒体效果成为摆在业内人士面前的难…

JMeter测试报错422 Unprocessable Entity

添加HTTP信息头&#xff1a; ​ HTTP请求-》添加-〉配置元件-》HTTP信息头管理器 ​ 如果需要送json&#xff0c;需要添加Content-Type:application/json&#xff0c;否则会报【422 Unprocessable Entity】

好用的CRM系统到底有多重要?怎么选?

我们都知道&#xff0c;CRM软件可以让企业效率加倍。但如果选错了CRM&#xff0c;企业损失点钱是小&#xff0c;客户转化率下降才是大。下面我们就来说说&#xff0c;市面上有哪些好用的CRM&#xff1f;以及好用的CRM软件的重要性。 好用的CRM软件的重要性&#xff1a; 客户管…

Qt 软件调试(一) Log日志调试

终于这段时间闲下来了&#xff0c;可以系统的编写Qt软件调试的整个系列。前面零零星星的也有部分输出&#xff0c;但终究没有形成体系。借此机会&#xff0c;做一下系统的总结。慎独、精进~ 日志是有效帮助我们快速定位&#xff0c;找到程序异常点的实用方法。但是好的日志才能…

百度 文心一言 sdk 试用

JMaven Central: com.baidu.aip:java-sdk (sonatype.com) Java sdk地址如上&#xff1a; 文心一言开发者 文心一言 (baidu.com) ERNIE Bot SDK https://yiyan.baidu.com/developer/doc#Fllzznonw ERNIE Bot SDK提供便捷易用的接口&#xff0c;可以调用文心一言的能力&#…

口袋参谋:如何避免宝贝被降权?这招屡试屡爽!

​至少99.99999%的店铺在今年都被降权过&#xff01;各家店铺被降权的原因&#xff0c;无非就一个原因&#xff0c;那就是s单&#xff01; s单的风险也就两种&#xff0c;一是操作问题&#xff0c;二是账号问题。 操作问题被降权&#xff0c;这个大家都心知肚明&#xff0c;s…

5大原因,设备校准为什么是实验室搬迁后的首要任务?

实验室搬迁是一个复杂而紧张的过程。要考虑的事情太多&#xff0c;很容易忽视您最重要的任务之一——检查设备在新环境中的性能。 校准对于确保设备安全运行和遵守监管标准至关重要。 1.保持合规性并遵守法律要求 生物技术和制药等行业有特定的校准要求&#xff0c;实验室必…

Java详解之I/O[BIO、NIO、AIO使用方法和示范代码]

前言&#xff1a; 小弟能力不足&#xff0c;认知有限&#xff0c;难免考虑不全面&#xff0c;希望大佬能给出更好的建议&#xff0c;指出存在的问题和不足&#xff0c;在此跪谢。 IO发展史 Java中对于I/O能力的支持主要分为三个比较关键的阶段&#xff1a; BIO 第一个阶段…

浅谈安科瑞直流电表在印尼某基站的应用

摘要&#xff1a;本文介绍了安科瑞直流电表在印尼的应用。主要用于印尼某基站的电流电压电能的计量&#xff0c;配合霍尔传感器对基站进行计量。 Abstract: This article introduces the application of Acrel DC meters in base station in Indonesia.The device is measuri…

【此时不应有 \anaconda3\envs\ blenderproc \Library\ssl\cacert.pem】问题已解决

conda 创建新环境后&#xff0c;使用conda activate blenderproc命令激活环境时出现以下错误&#xff1a; 此时不应有 \anaconda3\envs\ blenderproc \Library\ssl\cacert.pem 其他博客里面https://blog.csdn.net/weixin_46599926/article/details/132576960解释这个是因为co…

前端 HTML 和 JavaScript 的基础知识有哪些?

前端开发是Web开发的一个重要领域&#xff0c;涉及到HTML&#xff08;Hypertext Markup Language&#xff09;和JavaScript两个主要的技术。HTML用于定义网页的结构和内容&#xff0c;而JavaScript用于实现网页的交互和动态效果。以下是前端HTML和JavaScript的基础知识&#xf…

如何做好测试管理岗?深度分析职业规划

在给学生做职业规划的时候&#xff0c;经常就有同学说&#xff1a;我以后要做管理岗&#xff01;其实对于很多刚入行的同学&#xff0c;可能说这句话的时候并没有真正理解管理岗需要做什么事&#xff0c;以及需要具备什么样的技能。所以&#xff0c;作为资深测试经理&#xff0…

飞翔的小鸟——Java

一、创建文件、包、类、插入图片文件 二、app包 1、Gameapp类&#xff08;运行游戏&#xff09; package app;import main.GameFrame;public class Gameapp {public static void main(String[] args) {//游戏的入口new GameFrame();} } 三、main包 1、Barrier&#xff08…

无需外接显示器,直接使用windows安装树莓派系统并可远程桌面登录

准备工作: 1.安装树莓派官方烧录工具 raspberry pi imager 2.下载树莓派系统镜像(也可选择在线下载安装) 打开imager工具&#xff0c;选择需要安装包树莓派版本 点击"NEXT"&#xff0c;在弹出的选项中选择编辑设置。 设置登录名和密码&#xff0c;已经所连接的wif…

统一用户桌面壁纸怎么设置

统一用户桌面壁纸的设置方法有多种&#xff0c;以下列举两种&#xff1a; 方法一&#xff1a;个人更换壁纸 1、右键桌面&#xff0c;鼠标选择“个性化”。 2、进入个性化之后&#xff0c;单击下面的“桌面背景”图标。 3、点击“浏览”选择自己备好的桌面壁纸&#xff0c;点击…

昇腾Atlas 200I DK A2实现安全帽识别

文章目录 环境依赖编译测试总结 环境依赖 软件版本说明获取方式mxVision5.0.RC2mxVision软件包获取方式Ascend-CANN-toolkit6.2.RC2Ascend-cann-toolkit开发套件包获取方式Ubuntu22.04 代码仓库地址&#xff1a; https://gitee.com/ascend/ascend_community_projects/tree/31…

01_原理-事件循环

01_原理-事件循环 文章目录 01_原理-事件循环一、浏览器的进程模型①&#xff1a;何为进程&#xff1f;②&#xff1a;何为线程&#xff1f;③&#xff1a;浏览器有哪些进程和线程&#xff1f; 二、渲染主线程是如何工作的&#xff1f;三、若干解释①&#xff1a;何为异步&…

不展现报表直接打印

不展现直接打印可以考虑这么几种方式&#xff1a;1、如果使用自带 demo 下的 jsp&#xff0c;可以把展现报表的 div 设置为隐藏&#xff0c;点击打印按钮可以打印&#xff1b;如果按钮都不想点&#xff0c;看下 toolbar.jsp 内打印按钮的 js 函数&#xff0c;在 jsp 末尾调用一…

LaTeX引文.bib方式插入报错 misplaced alignment tab character \end

写latex报了个莫名的错误&#xff0c;找了好久才找到原因。 参考文章 简单记录一下 在LaTeX中&符号有特殊含义&#xff0c;不能直接写。 直接复制生成的bibtex可能会有&&#xff0c;这种情况下可能会报错。 解决方法就是在&符号前面加一个斜杠\一定删除之前编译产生…

量子计算突破云渲染资源调度!真机测试完整报告公开!

​摘要&#xff1a;在影视领域中&#xff0c;经常会涉及大量的视频图像渲染工作&#xff0c;而往往在这种大规模、动态渲染场景下&#xff0c;普遍存在着冗余渲染现象。究其原因在于大规模的图像渲染通常要求在短时间内做出渲染任务的算力分配决策&#xff0c;而经典计算机无法…