springboot整合minio最新版

不知不覺(jué),2020馬上就過(guò)去了,在這最后一天的時(shí)間里,還是得把留下的內(nèi)容更新了。2021新的開(kāi)始,樹(shù)立新的目標(biāo),過(guò)去的就讓它成為過(guò)去吧。元旦臨近,在這里祝大家元旦快樂(lè)!今天我還是把上篇說(shuō)的Springboot整合minio的內(nèi)容更新一下,作為2020年最后一篇文章。廢話(huà)不多說(shuō),直接進(jìn)入主題。

第一步:查找minio最新依賴(lài),通過(guò)maven查詢(xún)網(wǎng)站查詢(xún),這搜索框輸入minio,如下:

image.png

點(diǎn)擊minio進(jìn)入查看maven依賴(lài),可以看到最新版為8.0.3

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.0.3</version>
</dependency>

gradle

compile group: 'io.minio', name: 'minio', version: '8.0.3'

第二步:(整合到項(xiàng)目中)
1.將依賴(lài)添加到新建的springboot項(xiàng)目中,在pom.xml添加
2.配置minio客戶(hù)端,不會(huì)的話(huà)參考minio java sdk文檔,但是這個(gè)文檔給的是3.0.10版本的sdk,與新版的不兼容,最新版的還是看github地址

參數(shù) 說(shuō)明
Endpoint 對(duì)象存儲(chǔ)服務(wù)的URL
Access Key Access key就像用戶(hù)ID,可以唯一標(biāo)識(shí)你的賬戶(hù)
Secret Key Secret key是你賬戶(hù)的密碼

默認(rèn)安裝不指定Access key 和Secret key 的話(huà)都是minioadmin, Endpoint則為服務(wù)器地址:如我安裝的的端口為1024,那Endpoint就是:http://localhost:1024
為了方便我們通過(guò)bean的方式注入客戶(hù)端如下:
yml

spring:
  # 配置文件上傳大小限制
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

# minio 參數(shù)配置
minio:
  endpoint: http://localhost:1024
  accessKey: minioadmin
  secretKey: minioadmin

@Configuration
public class MinIoClientConfig {

    @Value("${minio.endpoint}")
    private String endpoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;

    /**
     * 注入minio 客戶(hù)端
     * @return
     */
    @Bean
    public MinioClient minioClient(){

    return MinioClient.builder()
                        .endpoint(endpoint)
                        .credentials(accessKey, secretKey)
                        .build();
    }
}

ok,現(xiàn)在客戶(hù)端已注入spring容器中,在使用的時(shí)候,只需要獲取就可以了。

第三步: 文件上傳
1.新增一個(gè)UploadController控制器用于處理文件上傳,如下:

@RestController
public class UploadController {

    @Resource
    private MinioClient minioClient;

    /**
     * 文件上傳
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public String upload(MultipartFile file){

        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().object(file.getOriginalFilename())
                    .bucket("test")
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(),file.getSize(),-1).build();

            minioClient.putObject(objectArgs);
            return "ok";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }
}

注意這里的bucket是我提前在minio中新增好的,如果沒(méi)有的話(huà),可以自己手動(dòng)添加,也可以通過(guò)代碼添加,具體參考sdk的說(shuō)明,這里就不多說(shuō)了。
2.通過(guò)postman測(cè)試文件上傳


image.png

點(diǎn)擊執(zhí)行后返回ok,執(zhí)成功,此時(shí)通過(guò)minio web端看看文件是否上傳成功

image.png

看到剛上傳的文件就說(shuō)明成功了。
3.其他說(shuō)明,如何通過(guò)瀏覽器訪(fǎng)問(wèn)剛上傳的圖片呢,就是通過(guò)endpoint服務(wù)地址加bucket名稱(chēng)加圖片的名稱(chēng),在本例子訪(fǎng)問(wèn)路徑則為:http://localhost:1024/test/5b01ca40273bcf53f4e6d84c0c595642.gif,可是為什么點(diǎn)擊之后不能訪(fǎng)問(wèn)呢,原因是因?yàn)槊總€(gè)bucket都有權(quán)限控制,要能訪(fǎng)問(wèn)的話(huà)需要放開(kāi)權(quán)限,用過(guò)阿里云的oss存儲(chǔ)的都應(yīng)該知道這個(gè)機(jī)制的。
image.png

設(shè)置好后,再訪(fǎng)問(wèn):
image.png

ok,此時(shí)就可以正常訪(fǎng)問(wèn)我們剛上傳的圖片了。

第四步:文件下載
在UploadController控制其中新增download方法,如下:

  /**
     * 下載文件
     * @param filename
     */
    @GetMapping("/download/{filename}")
    public void download(@PathVariable String filename, HttpServletResponse res){

        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket("test")
                .object(filename).build();

        try (GetObjectResponse response = minioClient.getObject(objectArgs)){
            byte[] buf = new byte[1024];

            int len;

            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){

                while ((len=response.read(buf))!=-1){

                    os.write(buf,0,len);

                }
                os.flush();

                byte[] bytes = os.toByteArray();

                res.setCharacterEncoding("utf-8");
                res.setContentType("application/force-download");// 設(shè)置強(qiáng)制下載不打開(kāi)
                res.addHeader("Content-Disposition", "attachment;fileName=" + filename);
                try ( ServletOutputStream stream = res.getOutputStream()){
                    stream.write(bytes);
                    stream.flush();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

通過(guò)訪(fǎng)問(wèn)下載地址:http://localhost:8421/download/5b01ca40273bcf53f4e6d84c0c595642.gif,文件下載下來(lái)能夠正常顯示,則說(shuō)明成功。

總結(jié):
通過(guò)以上操作,我們已經(jīng)完成springboot與minio的整合,可以通過(guò)minio sdk實(shí)現(xiàn)文件上傳與下載功能。當(dāng)然還有其他api操作,我就不多介紹了,都是一個(gè)思路,調(diào)用傳值就可以了,自己嘗試一下,就能get到了。今天就到這里,demo代碼會(huì)放到碼云上,需要的同學(xué)可以下載參考一下。最后,祝大家元旦快樂(lè),喜歡我的文章記得關(guān)注我哦??!

demo代碼地址:https://gitee.com/zzj1992/minio-demo.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容