当前位置:网站首页>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 .
边栏推荐
- js题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
- @Autowired 和 @Resource 的区别
- Priority inversion and deadlock
- C language, log print file name, function name, line number, date and time
- Detailed explanation of Union [C language]
- JS regular expression basic knowledge learning
- OSPF message details - LSA overview
- Basic operations of databases and tables ----- view data tables
- Learning notes of JS variable scope and function
- E-commerce data analysis -- salary prediction (linear regression)
猜你喜欢
Comparaison des solutions pour la plate - forme mobile Qualcomm & MTK & Kirin USB 3.0
AMBA、AHB、APB、AXI的理解
编译原理:源程序的预处理及词法分析程序的设计与实现(含代码)
ES6 grammar summary -- Part I (basic)
VSCode基础配置
Remember an experience of ECS being blown up by passwords - closing a small black house, changing passwords, and changing ports
Custom view puzzle getcolor r.color The color obtained by colorprimary is incorrect
Postman 中级使用教程【环境变量、测试脚本、断言、接口文档等】
arduino JSON数据信息解析
JS變量類型以及常用類型轉換
随机推荐
Cannot change version of project facet Dynamic Web Module to 2.3.
Oppo vooc fast charging circuit and protocol
RT thread API reference manual
Esp8266 uses Arduino to connect Alibaba cloud Internet of things
E-commerce data analysis -- salary prediction (linear regression)
Comparison of solutions of Qualcomm & MTK & Kirin mobile platform USB3.0
MySQL時間、時區、自動填充0的問題
C language callback function [C language]
arduino获取随机数
JS变量类型以及常用类型转换
[Offer29] 排序的循环链表
open-mmlab labelImg mmdetection
Kaggle competition two Sigma connect: rental listing inquiries (xgboost)
Important methods of array and string
[leetcode622]设计循环队列
ESP8266使用arduino连接阿里云物联网
open-mmlab labelImg mmdetection
By v$rman_ backup_ job_ Oracle "bug" caused by details
Mp3mini playback module Arduino < dfrobotdfplayermini H> function explanation
JS数组常用方法的分类、理解和运用