还在用InputStream的available()方法获取流的字节数吗?那你可要小心了!

news2024/11/25 16:14:19

问题说明

因为项目需求,需要从一个url获取文件流然后保存到minio文件服务器中。

先看看下面的代码片段

MinioClient minioClient = MinioClient.builder()
                .endpoint(new URL("http://ip:port"))
                .credentials("username", "password")
                .build();
String urlStr = "url";
URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(3000);
conn.setRequestMethod("GET");
        conn.setRequestProperty("User-Agent", "Mozilla/5.0");
        conn.setRequestProperty("Content-Type", "application/octet-stream");
InputStream inputStream = conn.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
                .object("objectpath")
                .bucket("bid")
                .contentType("application/octet-stream")
                .stream(inputStream, inputStream.available(), -1)
                .build());

就是简单的从url获取到输入流,然后上传到minio。我写完之后看着没问题了,就开始测试了。

我先是从url获取一个pdf文件流,然后上传。奇怪的事情就发生了,上传的pdf文件下载下来打不开,提示“文件已损坏”。

然后按照上面的方式试了一个world文件,结果还是打不开。完犊子了,这代码看着也没问题啊,奇了怪了。

查找问题

会是什么问题呢?没有获取到流?还是上传的代码写错了?

因为项目一直就用上面代码的方式去上传文件的啊,要是有问题肯定早就有问题了啊,这个排除掉。

你说没有获取到流也不对啊,因为确实是上传了一个文件,只是打不开罢了。

所以,最后将问题定位到获取到的流肯定没有上传完整。

就去看两个文件的大小,确实是这样,只上传了一部分上去。

那么,问题就出现在inputStream.available()这块了,因为minio的stream方法的第二个参数是指定上传多少个字节。

查找资料

最近chatgpt比较火嘛,那就去问问它。
在这里插入图片描述
可见,available()方法能去判断流中有没有字节可读。但是,并不能得到流的精确总字节数。

解决方案

还是找chatgpt吧,毕竟很强大。

InputStream inputStream = // 实例化你的 InputStream 对象

byte[] buffer = new byte[1024];
int totalBytesRead = 0;
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    totalBytesRead += bytesRead;
}

System.out.println("总字节数: " + totalBytesRead);

我自己的思路是要创建一个ByteArrayOutputStream缓存区去将所有的字节保存起来,然后要将ByteArrayOutputStream的总字节数传递给minio。

上代码

MinioClient minioClient = MinioClient.builder()
                .endpoint(new URL("http://ip:port"))
                .credentials("username", "password")
                .build();
        String urlStr = "url";
        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(3000);
        conn.setRequestMethod("GET");
        conn.setRequestProperty("User-Agent", "Mozilla/5.0");
        conn.setRequestProperty("Content-Type", "application/octet-stream");
        InputStream inputStream = conn.getInputStream();
        // 加入缓存
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) > -1 ) {
            byteArrayOutputStream.write(buffer, 0, len);
        }
        byteArrayOutputStream.flush();
        minioClient.putObject(PutObjectArgs.builder()
                .object("objectpath")
                .bucket("bid")
                .contentType("application/octet-stream")
                .stream(inputStream, byteArrayOutputStream.size(), -1)
                .build());

大家还有什么解决方案可以探讨一下?我也学习学习。

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

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

相关文章

关于npm install md5报错the command again as root/Administrator的解决办法

nodejs安装依赖报错 (venv) PS D:\pythonProject> npm install md5 npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! requiredBy: . npm ERR! } npm ERR! npm ERR! The operation was rejected by your operating system. npm ERR! Its possible that the file was…

QQ群内增加ChatGPT机器人

0. 起因 最近弄了一个QQ群,人在逐渐增多,问问题的人也越来越多,有些问题是编程基础问题,2023年了,这些问题都不应该由人类来解决了,交给AI吧。所以,想在QQ群里加个ChatGPT机器人,应…

simplify3d 打印参数设置笔记

专业实用且详细的打印教程 3D打印故障排除:所有问题和解决方案 simplify3d 切片软件使用 初始设置 材料:PLA 喷头温度 215 热床温度 60 导入的模型格式 stl 保存的模型名称可以是中文 但是名称中不允许有空格,否则我这个打印机加热好喷头和…

GORM---初级查询

文章目录 初始数据表一般查询Where条件普通SQL查询查询 Struct & Map Not 条件Or 条件内联条件额外查询选项FirstOrInitAttrsAssign FirstOrCreateAttrsAssign 初始数据表 一般查询 var p1, p2, p3, p4 connect.PersonInfo var ps []connect.PersonInfo// 把主键升序&…

2023年陕西彬州第八届半程马拉松赛153pb完赛

1、赛事背景 2023年6月3日,我参加了2023陕西彬州第八届半程马拉松赛,最终153完赛,PB了5分钟。起跑时间早上7点30分,毕竟6月天气也开始热了。天气预报显示当天还是小到中雨,上次铜川宜君半马也是雨天跑的,阴…

为何选择C语言作为大一编程入门?

C语言,编程之本,源于生命。作为一门最接近底层的高级语言,学习C语言有以下重要原因: 探索底层:C语言为我们提供了理解计算机底层工作原理的机会。通过学习C语言,我们能更容易理解内存管理、指针操作等底层知…

前后端分离项目SpringBoot-Shiro-jwt处理401响应码的方案

问题现象: 现在大多数项目已经实现前后端分离,当采用shiro作为安全框架时,如果请求的token已过期或未认证请求,会得到401的HTTP STATUS。此时在前端还会因为401的错误弹出一个登录认证的弹框。效果如下: 经分析&#…

DataLeap的全链路智能监控报警实践(一):常见问题

随着字节跳动业务的快速发展,大数据开发场景下需要运维管理的任务越来越多,然而普通的监控系统只支持配置相应任务的监控规则,已经不能完全满足当前需求,在日常运维中开发者经常会面临以下几个问题: 任务多&#xff0c…

凝聚全球顶尖力量,助力开源行业发展 | 2023开放原子全球开源峰会开幕式暨高峰论坛亮点抢先看!

亮点攻略 一触即发 6月11-13日|中国北京 作为开源领域一年一度的盛事,由2023全球数字经济大会组委会主办,开放原子开源基金会、北京市经济和信息化局、北京经济技术开发区管理委员会承办的2023开放原子全球开源峰会将于6月11日至13日在北京…

实现Mac使用空格键预览更多文件格式

mac上的快速预览非常好用,但是对于许多格式的不支持造成了体验感的割裂。例如对于使用频繁的.md、.js、.py等格式的文件,无法生成缩略图。可以通过在「Quick Look」中 安装插件的方式来实现预览格式的扩展。 1. 插件的安装 下载的插件一般有两种格式&am…

SpringBoot的高考志愿填报系统(含源码+数据库)

系统获取方式: 1.系统分析 在本系统中,基于SpringBoot的高考志愿填报系统需要满足以下功能需求: 1.用户可以根据自己的院校类型、办学类型、层次类型、地域等因素筛选高校。 2.用户可以查询到所选高校的基本信息,包括学校的概况…

vcsa6.7更换证书

今天一早,有现场反馈,vcenter无法登录,估计到可能是证书到期了 在浏览器中确认下,确实是证书到期的问题 通过查看你sts不过期,直接更新全部证书 To escape to local shell, press CtrlAlt]. VMware vCenter Server Ap…

翻车了,lombok这玩意真坑

目录 背景排查Setter-Getter方法的坑解决原因解决方案原因解决方案 总结 背景 青柠最近在写自己的项目,刚开始就写不下去了,心态崩了,这啥玩意啊,就是找不到问题在哪? 早前,在项目当中引入了Lombok插件&a…

zabbix配置监控日志

目录 一、zabbix日志监控的功能 二、zabbix监控日志的条件 三、日志监控的监控指标 四、日志监控Item的配置案例 一、zabbix日志监控的功能 Zabbix-agent支持对日志文件的监控,可以对日志对的关键字进行监控,然后告警。日志监控支持普通的日志文件&am…

ChatGPT与软件架构(5) - 网络安全

安全是任何系统都无法回避的关键要素,本文介绍了若干利用ChatGPT增强的网络安全攻击,并提出了应对策略。原文: ChatGPT and Cyber Security Benjamin Elliott Unsplash 如果你还不熟悉ChatGPT,那么考虑到这种生成式人工智能服务的快速崛起&am…

Hive SQL 语法大全~

基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C) 如上语法,在语法描述中出现: [],表示可选,如上[LOCATION]表示可写、可不…

神州数码DCRS试题题目合集

2017.11.3 DCRS 在公司总部的DCRS上配置,配置设备enable密码,并且在登录设备时必须正确输入enable密码才能进入交换机的配置模式。 在公司总部的DCRS上配置,在交换设备上开启SSH管理功能,用户名和密码都是DCN,并关闭…

flutter系列之:做一个会飞的菜单

文章目录 简介定义一个菜单项目让menu动起来添加菜单内部的动画总结 简介 flutter中自带了drawer组件,可以实现通用的菜单功能,那么有没有一种可能,我们可以通过自定义动画来实现一个别样的菜单呢? 答案是肯定的,一起…

(栈和队列) 150. 逆波兰表达式求值 ——【Leetcode每日一题】

❓150. 逆波兰表达式求值 难度:中等 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’、‘*’ 和 ‘/’ 。每个操作数&#…

vue制作自己的组件库(仿ElementUI)

1.首先自己创建个新的vue项目,之后更改下目录形式,将src文件更改为examples,这里是专门放组件展示的md文件,packages文件里是放自己写的组件代码 2.然后是开始配置vue.config.js文件 ,其中md-loader是读取md文件的相关…