当前位置:网站首页>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 .
边栏推荐
- VSCode基础配置
- Basic operations of databases and tables ----- modifying data tables
- 如何给Arduino项目添加音乐播放功能
- Programmers can make mistakes. Basic pointers and arrays of C language
- Variable parameter principle of C language function: VA_ start、va_ Arg and VA_ end
- Single chip Bluetooth wireless burning
- RT thread API reference manual
- Reno7 60W super flash charging architecture
- Pytoch temperature prediction
- About using @controller in gateway
猜你喜欢
基于Redis的分布式锁 以及 超详细的改进思路
AMBA、AHB、APB、AXI的理解
level16
Vscode basic configuration
程序设计大作业:教务管理系统(C语言)
Redis based distributed locks and ultra detailed improvement ideas
Arduino uno R3 register writing method (1) -- pin level state change
小天才电话手表 Z3工作原理
JS 函数提升和var变量的声明提升
Missing value filling in data analysis (focus on multiple interpolation method, miseforest)
随机推荐
Basic operations of databases and tables ----- classification of data
VIM command line notes
Pat 1097 duplication on a linked list (25 points)
Single chip Bluetooth wireless burning
Comparison of solutions of Qualcomm & MTK & Kirin mobile platform USB3.0
Redis based distributed ID generator
AMBA、AHB、APB、AXI的理解
Selective sorting and bubble sorting [C language]
如何给Arduino项目添加音乐播放功能
Embedded startup process
C language, log print file name, function name, line number, date and time
[Red Treasure Book Notes simplified version] Chapter 12 BOM
Bubble sort [C language]
Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
Time slice polling scheduling of RT thread threads
Vscode basic configuration
程序设计大作业:教务管理系统(C语言)
Learning notes of JS variable scope and function
RuntimeError: cuDNN error: CUDNN_ STATUS_ NOT_ INITIALIZED
Important methods of array and string