解决InputStream流无法重复使用的问题

news2024/12/28 3:34:37

一.需求

现在有个需求,要通过InputStream流先去判断文件类型,然后再上传文件,这样就会用到两次InputStream。

二.问题

这个功能之前的同事已经做了一版,一直以为是正常的,毕竟都很久了,但是我用的时候发现上传的文件总是空的,只能去仔细看下代码了。

三.排查

try (InputStream in = inputStream) {
            //检验文件
            CheckFileUtil.checkFile(inputStream, FileUtil.extName(filename));
            LoggerFactory.getLogger(this.getClass()).info("上传文件的文件名="+filename);
            //上传文件
            String filePathURL = saveToDisk(in, FileUtil.extName(filename));

            FileInfo fileInfo = new FileInfo();
            fileInfo.setId(RandomUtil.simpleUUID());
            fileInfo.setFileName(filename);
            fileInfo.setFileType(FileUtil.extName(filename));

之前的代码逻辑是用原来的inputStream去校验,然后用赋值后的in去上传文件,开始看到这里也没发现有什么问题,感觉很正常。

只能去加日志,打断点调试了,最终发现在校验文件之后,不管是inputStream还是in都是空的了,恍然大悟。由于流读过一次就不能再读了。

四.解决

开始想着去复制一遍这个流就行了,查了下才知道不行,InputStream对象本身不能复制,它也没有实现Cloneable接口。

那就先用byte[]去存储,然后用的时候在转换。调整后的代码

public static byte[] readInputStreamToByteArray(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, bytesRead);
        }
        return byteArrayOutputStream.toByteArray();
    }

    @Override
    public FileInfo upload(String filename, Long size, InputStream inputStream) {
        try (InputStream in = inputStream) {
            byte[] bytes = readInputStreamToByteArray(in);
            //检验文件
            CheckFileUtil.checkFile(new ByteArrayInputStream(bytes), FileUtil.extName(filename));
            LoggerFactory.getLogger(this.getClass()).info("上传文件的文件名="+filename);
            //上传文件
            String filePathUrl = saveToDisk(new ByteArrayInputStream(bytes), FileUtil.extName(filename));

但是这种明显只适用于文件不大的时候,不知道如果文件较大的情况下,该怎么进一步优化,先记录下,后面遇到了再补充

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

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

相关文章

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求,研究了实现…

“量子+半导体”!罗姆半导体与量子公司Quanmatic进行应用探索

​内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨琳梦 卉可 深度好文:1500字丨10分钟阅读 2023年,日本半导体制造商Rohm(罗姆)与量子算法解决方案公司Quanmatic达成合作…

【开源精选导航】GitHub-Chinese-Top-Charts:一榜在手,优质中文项目轻松找寻

各位热爱开源技术的朋友们,你们是否有过这样的困扰:面对浩瀚的GitHub海洋,想找寻那些具有高质量中文文档的优秀开源项目却无从下手?今天,我们就为大家揭晓一个宝藏般的开源项目——GitHub 中文项目集合(访问…

CSA发布 | 法律视角下的数据出境《2023年数据出境合规年鉴》

在全球数字产业以及大数据和云计算技术快速发展的背景下,数据流动对世界经济的影响日益显著。由此带来的数据红利和数据安全之间的冲突,将对未来数字经济的发展方向产生深刻影响。 2023 年可称为中国数据跨境监管的元年,这一年初出境评估的“…

flask基于python的个人理财备忘录记账提醒系统vue

在当今高度发达的信息中,信息管理改革已成为一种更加广泛和全面的趋势。 “备忘记账系统”是基于Mysql数据库,在python程序设计的基础上实现的。为确保中国经济的持续发展,信息时代日益更新,蓬勃发展。同时,随着信息社…

BPF开发: 从Hello World开始

Part 1 概述 1. 背景 BPF技术被列为近些年Linux内核领域最火热的新领域之一。它成功的给Linux内核赋予了少量的动态可编程性,可以在Linux内核运行时,实时修改内核的行为,但不需要重新编译和重启内核。据此,BPF在Linux世界中: 网络可观测性…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

ADB的配置和使用及刷机root

ADB的配置和使用 ADB即Android Debug Bridge,安卓调试桥,是谷歌为安卓开发者提供的开发工具之一,可以让你的电脑以指令窗口的方式控制手机。可以在安卓开发者网页中的 SDK 平台工具页面下直接下载对应系统的 adb 配置文件,大小只…

腾讯云0基础10秒搭建幻兽帕鲁游戏联机服务器

幻兽帕鲁(Palworld)是一款多人在线游戏,为了获得更好的游戏体验,需要搭建一个稳定、高效的游戏联机服务器。腾讯云提供了一种简单、快速的方法,让新手小白也能0基础10秒搭建幻兽帕鲁游戏联机服务器! 本文将…

人工视觉仍然需要图像采集卡

最初,图像采集卡被用作模拟视频数字转换器和图像缓冲器,但如今它们能够执行复杂的任务,例如图像处理。图像采集卡的设计不断发展,旨在提高系统性能并减少计算机处理需求。 除了图像采集之外,图像采集卡还执行机器视觉…

【前端-VUE+TS】Vue3组件化-下(五)

一. 插槽的使用 1.1. 认识插槽slot 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示;但是为了让这个组件具备更强的通用性,我们不能将组件中的内容限制为固定的d…

如何在Excel中清除单元格的格式?这里有详细步骤

Microsoft Excel提供了大量样式选项来自定义电子表格的外观。但是,如果你需要删除格式,则可以很容易地删除选定单元格和整个工作表的格式。我们将向你展示如何操作。 ​注意:清除格式只会删除文本的样式;将保留你的实际文本。 如…

基于Android的成人教育课程学习考试系统uniAPP的 小程序_12lo1

APP性能需求 (1)会员在安卓App页面各种操作可及时得到反馈。 (2)该平台是提供给多个会员使用的平台,会员使用之前需要注册登录。登录验证后,会员才可进行各种操作[10]。 (3)管理员用…

在线视频链接怎么做成二维码?扫码播放在线视频的制作方法

怎么把在线视频链接做成二维码图片分享给其他人呢?现在通过二维码来传递内容是很多人在用的一种方式,比如文件、视频、音频、网址等都可以用二维码生成器来做成二维码图片后使用。 采用二维码图片的方式可以有效的降低成本,提高传播的速度&a…

马哈鱼SQLFlow Lite的python版本

Gudu SQLFlow 是一款用来分析各种数据库的 SQL 语句和存储过程来获取复杂的数据血缘关系并进行可视化的工具。 Gudu SQLFlow Lite version for python 可以让 python 开发者把数据血缘分析和可视化能力快速集成到他们自己的 python 应用中。 Gudu SQLFlow Lite version for p…

【web | CTF】攻防世界 easyupload

天命:好像也不太easy 目录 步骤一:准备文件 步骤二:上传文件 本条题目有好几个防御点: 后缀名防御:只能上传图片格式内容防御:内容不能有php图片头防御:检测文件的头部信息,是否是…

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令,哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…

iZotope RX 10.4.2 mac激活版 音频修复和增强工具

iZotope RX 10 for Mac是一款专业的音频修复软件,旨在提供强大、精确的工具,让用户能够清晰、纯净地处理音频。以下是其主要功能和特点: 软件下载:iZotope RX 10.4.2 mac激活版下载 强大的降噪功能:iZotope RX 10采用了…

Mushroom Monsters - Fantasy RPG

蘑菇怪物PBR是一个2米高的生物。他可以摆出三种静态姿势中的任何一种,等待他的对手感到惊讶,或者他可以四处奔跑,攻击和施放法术,甚至冲锋。他用头撞击敌人,可以跳起来撞击他们,也可以低头直冲。他还有一个“魔法”攻击,扭动头部并切削。 使用混合形状功能将网格变形为无…

【项目日记(六)】第二层: 中心缓存的具体实现(下)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你做项目   🔝🔝 开发环境: Visual Studio 2022 项目日…