Hutool一行代码下载文件,无需落地解压文件并上传到MinIO

Hutool一行代码下载文件,无需落地解压文件并上传到MinIO

最近对接外部系统,需要每天定时获取电子回单,我们一致默认回单是pdf,所以,我们系统并没有做文件存储,直接存了文件地址,由于事先没有沟通好回单的传输格式,以至于在系统上线之后才发现,外部系统提供的文件格式和预想中的不一样。他们是把pdf的回单压缩了一次。这使得我们无法直接将文件传输到税务系统。外部系统是提供的他们所谓的标准接口,如果要调整也可以,加钱,说到钱,那就只有自己来解决了。

我的思路是,先调外部接口,获取到回单压缩文件,将文件解压,取出文件并上传到MinIO中,然后将MinIO的文件地址存入到数据库中,考虑到文件比较小,单每天会产生接近上万的文件,如果将文件先落地、再解压上传,会有一个磁盘消耗。所以,这里,我们就直接在内存中操作。

关于网络文件下载,压缩文件解压的工具类在网上也是非常多,由于之前一直在用Hutool,我们便使用它来处理网络文件的下载吧。非常方便,仅需一行代码接口获取打文件流

下载远程文件

1
byte[] zipFile = HttpUtil.downloadBytes("网络文件地址");  //获取网络文件流

解压文件

在Hutool中,有提供ZipUtil这个工具类,但是针对zip格式的压缩文件的解压,Hutool需要先落地文件,再调用ZipUtil.unzip来解压。

那么,这显示不符合我需要,此时,我们可以去找其他的工具类或者用JDK自带的ZipInputStream来处理。我则选择了后者。

1
2
3
4
InputStream inputStream=new ByteArrayInputStream(zipFile);
ZipInputStream zipInputStream=new ZipInputStream(inputStream,Charset.defaultCharset());
zipInputStream.getNextEntry(); //获取下一个文件
byte[] unzipFileByte=IoUtil.readBytes(zipInputStream); //获取压缩文件中的文件流

上传到MinIO

首先,初始化MinIO的配置

1
2
3
4
5
6
7
8
@Bean
public MinioClient minioClient(){
MinioClient client= MinioClient.builder()
.endpoint(config.getUrl())
.credentials(config.getAccessKey(), config.getSecretKey())
.build();
return client;
}

上传文件流到MinIO

1
minioClient.putObject(PutObjectArgs.builder().bucket(this.bucket).object("文件名").stream(new ByteArrayInputStream(unzipFileByte), unzipFileByte.length, -1).build());

组装MinIO的URL地址,并存入到数据库中。

Hutool一行代码下载文件,无需落地解压文件并上传到MinIO

https://blogs.52fx.biz/posts/15903235.html

作者

eyiadmin

发布于

2023-02-17

更新于

2024-05-31

许可协议

评论