当前位置:网站首页>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 .

原网站

版权声明
本文为[A pole]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207060913401682.html