当前位置:网站首页>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 .
边栏推荐
- Single chip Bluetooth wireless burning
- RT thread API reference manual
- Detailed explanation of truncate usage
- Redis based distributed locks and ultra detailed improvement ideas
- JS变量类型以及常用类型转换
- Kaggle competition two Sigma connect: rental listing inquiries (xgboost)
- JS變量類型以及常用類型轉換
- ESP learning problem record
- 【ESP32学习-1】Arduino ESP32开发环境搭建
- arduino获取数组的长度
猜你喜欢
Priority inversion and deadlock
单片机蓝牙无线烧录
MySQL takes up too much memory solution
JS变量类型以及常用类型转换
[esp32 learning-1] construction of Arduino esp32 development environment
Comparison of solutions of Qualcomm & MTK & Kirin mobile platform USB3.0
CUDA C programming authoritative guide Grossman Chapter 4 global memory
E-commerce data analysis -- salary prediction (linear regression)
[Red Treasure Book Notes simplified version] Chapter 12 BOM
js 变量作用域和函数的学习笔记
随机推荐
Redis cache update strategy, cache penetration, avalanche, breakdown problems
[esp32 learning-2] esp32 address mapping
STM32 how to locate the code segment that causes hard fault
RuntimeError: cuDNN error: CUDNN_ STATUS_ NOT_ INITIALIZED
Keyword inline (inline function) usage analysis [C language]
Mp3mini playback module Arduino < dfrobotdfplayermini H> function explanation
@The difference between Autowired and @resource
Pytoch implements simple linear regression demo
编译原理:源程序的预处理及词法分析程序的设计与实现(含代码)
Basic operations of databases and tables ----- modifying data tables
MySQL replacement field part content
Dead loop in FreeRTOS task function
单片机蓝牙无线烧录
MP3mini播放模块arduino<DFRobotDFPlayerMini.h>函数详解
Problèmes avec MySQL time, fuseau horaire, remplissage automatique 0
Amba, ahb, APB, Axi Understanding
Intermediate use tutorial of postman [environment variables, test scripts, assertions, interface documents, etc.]
Imgcat usage experience
高通&MTK&麒麟 手機平臺USB3.0方案對比
ESP8266通过arduino IED连接巴法云(TCP创客云)