当前位置:网站首页>Minio file download problem - inputstream:closed
Minio file download problem - inputstream:closed
2022-07-06 12:21:00 【A pole】
Preface
Recently, I am building a simple blog system , Because uploading and downloading pictures is a big demand , And then I Relatively poor I want to challenge myself , Just use Minio To build oss service . Official website :https://min.io/.
In order to save everyone's time , Let me start with a brief overview , So that everyone can judge whether to continue to look down :
In the use of minio When downloading files , The code keeps reporting errors java.io.IOException: closed , Finally, I found that it was because try () {} Caused by grammar problems .
cause
Its download object Methods , Probably pass in the file name and then return a InputStream, What I need to do is to get the stream , adopt controller Back to front end .
My idea is to put stream Go straight back to the front end , Instead of downloading locally . Of course, you need to encapsulate a tool class MinioUtils , Then call the method in the tool class , Get it first inputStream , And then in controller Layer to do conversion .
after
Tried many methods , I also refer to many blogs , I can't get it out , Has been an error java.io.IOException: closed , I'm directly stupid , The key is that there is no call in my code stream.close(); ah !
I'm thinking of , Is it because the length of byte stream is uncertain , So I ended the download ahead of schedule , It's mainly my understanding of http The agreement only stays at the level of understanding , I don't quite understand response The various parameters in it , I'm not sure in the code I wrote , Is there any way to automatically calculate the length for me . So I used stream.available(); To get its length , And define a byte Array , But this is also wrong , When I call this method , The code has already reported closed It's wrong ...
I thought it might be minio The problem of , Once wanted to give up minio, But I think I've been doing it for so long , It's a little uneconomical to give up .
reason
It took two days , Finally found the problem . In fact, it's not about the interface , It is Java Of try () {} Grammar problem .
public void downloadFile(String fileName) throws Exception {
try (InputStream inputStream = minioClient.getObject(minioConfig.getBucketName(), storePath))
{
return inputStream;
} catch (Exception e) {
logger.error(" File download exception ");
e.printStackTrace();
}
}
// The above code doesn't seem to call closed(); , But it's actually return After that, it has been called
// This is because of the try () {} grammar , In the exit Sentence block {} when , Will automatically call closed Method to release resources
resolvent
For this reason , My code keeps reporting errors , After finding out why , The problem will be solved naturally , Here are two solutions :
// Pass in the input stream for processing
public void downloadFile(String fileName, ServletOutputStream outputStream) throws Exception {
try (InputStream inputStream = minioClient.getObject(GetObjectArgs
.builder()
.bucket(bucketName)
.object(fileName)
.build());
) {
IOUtils.copy(inputStream, outputStream);
} catch (Exception e) {
logg.error(" File download exception ");
e.printStackTrace();
}
}
// Or change the grammar to ordinary try{}catch{}
public InputStream download(String fileName) throws Exception {
try {
return minioClient.getObject(GetObjectArgs
.builder()
.bucket(bucketName)
.object(fileName)
.build());
} catch (Exception e) {
e.printStackTrace();
throw new Exception(" File download failed ");
}
}
Postscript
After that , Look back at the original blog and official documents , It seems that most of them write like this , In fact, there is no big problem , Just because I want to make such a package , So my code thinking is the same as theirs , But the implementation has achieved different results .
边栏推荐
- Pytorch: tensor operation (I) contiguous
- Working principle of genius telephone watch Z3
- 列表的使用
- Several declarations about pointers [C language]
- Imgcat usage experience
- E-commerce data analysis -- salary prediction (linear regression)
- C language, log print file name, function name, line number, date and time
- Flink late data processing (3)
- Esp8266 uses Arduino to connect Alibaba cloud Internet of things
- Programmers can make mistakes. Basic pointers and arrays of C language
猜你喜欢

(五)R语言入门生物信息学——ORF和序列分析

Basic operations of databases and tables ----- view data tables

Single chip Bluetooth wireless burning

arduino JSON数据信息解析

js 变量作用域和函数的学习笔记

Priority inversion and deadlock

Missing value filling in data analysis (focus on multiple interpolation method, miseforest)

Pytorch: tensor operation (I) contiguous

ESP学习问题记录

History object
随机推荐
Esp8266 connects to onenet cloud platform (mqtt) through Arduino IDE
[golang] leetcode intermediate - fill in the next right node pointer of each node & the k-smallest element in the binary search tree
Arduino gets the length of the array
小天才电话手表 Z3工作原理
2022.2.12 resumption
About using @controller in gateway
[899]有序队列
ESP8266连接onenet(旧版MQTT方式)
Stm32f1+bc20+mqtt+freertos system is connected to Alibaba cloud to transmit temperature and humidity and control LED lights
js题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
1081 rational sum (20 points) points add up to total points
arduino UNO R3的寄存器写法(1)-----引脚电平状态变化
[esp32 learning-2] esp32 address mapping
Understanding of AMBA, AHB, APB and Axi
Mysqldump error1066 error solution
Basic knowledge of lithium battery
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
列表的使用
Cannot change version of project facet Dynamic Web Module to 2.3.
Basic operations of databases and tables ----- view data tables