国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot集成Minio實(shí)戰(zhàn)詳解

這篇具有很好參考價值的文章主要介紹了SpringBoot集成Minio實(shí)戰(zhàn)詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

Minio簡介

介紹高性能分布式存儲文件服務(wù)Minio:Minio是基于Go語言編寫的對象存儲服務(wù),適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、音頻、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。區(qū)別于分布式存儲系統(tǒng),minio的特色在于簡單、輕量級,對開發(fā)者友好?。?!,認(rèn)為存儲應(yīng)該是一個開發(fā)問題而不是一個運(yùn)維問題。

1.安裝minio

可以到官網(wǎng)去下載
鏈接: https://www.minio.org.cn/download.shtml
minio springboot,java中間件,spring boot,java,docker,后端
本文采用的是使用主流的安裝方式:docker安裝(docker的教程大家可以訪問b站的教程進(jìn)行學(xué)習(xí),本文不作重點(diǎn)講解)
鏈接: https://blog.csdn.net/ouyang_zhen/article/details/118961684
linux系統(tǒng)中敲入如下命令

docker search minio
docker pull minio/minio
docker run -d -p 9000:9000 --name=minio --restart=always -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123456" -v /home/data:/data -v /home/config:/root/.minio  minio/minio server /data --console-address ":9000" --address ":9090"
docker logs -f containerid

或者使用docker-compose啟動
通過配置docker-compose.yml文件管理容器,通過docker-compose up -d 啟動容器
docker-compose.yml文件
這里的9100是配置訪問minio自帶的web管理后臺,9090是配置的服務(wù)器

version: "3.1"
services:
  minio:
    image: minio/minio:latest
    container_name: minio
    ports:
      - "9100:9000"
      - "9090:9090"
    volumes:
      - "./data:/data"
    environment:
      MINIO_ACCESS_KEY: "root"
      MINIO_SECRET_KEY: "12345678"
    command: server /data --console-address=":9000" --address=":9090"
    logging:
      driver: "json-file"
      options:
        max-size: "1m"

當(dāng)出現(xiàn)如下圖所示即代碼運(yùn)行成功,通過宿主機(jī)ip:9000訪問,輸入命令里的賬號/密碼登錄即可:
minio springboot,java中間件,spring boot,java,docker,后端
啟動成功后訪問 ip+9000(你運(yùn)行的端口號) 如下圖所示例,輸入你在命令行里的用戶名和我密碼

minio springboot,java中間件,spring boot,java,docker,后端

2.minio Ui界面的簡單使用

minio springboot,java中間件,spring boot,java,docker,后端

3.minio結(jié)合springboot

項(xiàng)目目錄結(jié)構(gòu):
minio springboot,java中間件,spring boot,java,docker,后端

修改配置文件
1,yml文件配置
2,minio配置類并注入容器進(jìn)行管理
3,封裝minio操作服務(wù)器的API的工具類,項(xiàng)目中封裝了單文件上傳、下載、刪除、查看功能,桶的創(chuàng)建等
公司具體的存儲業(yè)務(wù),在次基礎(chǔ)上根據(jù)公司業(yè)務(wù)來自行擴(kuò)展
4,編寫controller層,用postman進(jìn)行簡單的測試(測試類型:文本、文檔、表格、音頻、視頻、圖片)
yml配置:

spring:
  # 配置文件上傳大小限制
  servlet:
    multipart:
      max-file-size: 200MB
      max-request-size: 200MB
minio:
  server: http://120.76.159.196
  port: 9090
  accessKey: root
  secretKey: 12345678
  bucket: test
  urlprefix: /minio/



配置類:

/**
 * @Author xiaozq
 * @Date 2022/11/17 9:54
 * <p>@Description: 注意:這里不能用@Data,需手動寫gitter,setter
 * reason:與@ConfigurationProperties一起用的時候,配置文件的值不能賦值給對應(yīng)類屬性,屬性值均為null</p>
 */
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private String server;

    private int port;

    private String accessKey;

    private String secretKey;

    // 桶名
    private String bucket;

    // 統(tǒng)一前綴
    private String urlPrefix;

    /**
     * 創(chuàng)建minio連接對象
     * @return
     */
    @Bean
    public MinioClient minioClient(){
        return  MinioClient.builder()
                           .endpoint(server,port,false)
                           .credentials(accessKey,secretKey)
                           .build();
    }

    public void setServer(String server) {
        this.server = server;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }


    public void setUrlPrefix(String urlPrefix) { this.urlPrefix = urlPrefix; }

    public String getUrlPrefix() {
        return urlPrefix;
    }

    public String getServer() {
        return server;
    }

    public int getPort() {
        return port;
    }

    public String getAccessKey() {
        return accessKey;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public String getBucket() {
        return bucket;
    }
}



自定義封裝操作minio的api工具類:

**
 * @Author xiaozq
 * @Date 2022/8/5 10:42
 * <p>@Description:</p>
 */
@Component
public class MinioTemplate {

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucket}")
    public String bucketName;

    @Value("${minio.urlprefix}")
    public String urlprefix;

    /**
     * 判斷bucket是否存在,不存在則創(chuàng)建
     * @param name
     */
    public void existBucket(String name){
        try {
            boolean exist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if(!exist){
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 創(chuàng)建存儲bucket
     * @param bucketName 存儲bucket名稱
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 刪除存儲bucket
     * @param bucketName 存儲bucket名稱
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 文件上傳
     * @param file
     * @return
     */
    public Map<String, String> upload(MultipartFile file) {

        String filename = FileUtils.extractUploadFilename(file);
        try {
            InputStream inputStream = file.getInputStream();
            // 上傳到minio服務(wù)器
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(this.bucketName)
                    .object(filename)
                    .stream(inputStream, -1L, 10485760L)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回地址
        Map<String,String > resultMap = new HashMap<>();
        resultMap.put("url",filename);
        return  resultMap;
    }

    /**
     * 文件下載
     * @param fileName 文件名
     * @param delete   是否刪除
     * @throws IOException
     */
    public void fileDownload(@RequestParam(name = "fileName") String fileName,
                             @RequestParam(defaultValue = "false") Boolean delete,
                             HttpServletResponse response) {

            InputStream inputStream   = null;
            OutputStream outputStream = null;
            try {
                if (StringUtils.isBlank(fileName)) {
                response.setHeader("Content-type", "text/html;charset=UTF-8");
                String data = "文件下載失敗";
                OutputStream ps = response.getOutputStream();
                ps.write(data.getBytes("UTF-8"));
                return;
            }

            outputStream = response.getOutputStream();
            // 獲取文件對象
            inputStream =minioClient.getObject(GetObjectArgs.builder().bucket(this.bucketName).object(fileName).build());
            byte buf[] = new byte[1024];
            int length = 0;
            response.reset();
            response.setHeader("Content-Disposition", "attachment;filename=" +
                    URLEncoder.encode(fileName.substring(fileName.lastIndexOf("/") + 1), "UTF-8"));
            response.setContentType("application/octet-stream");
            response.setCharacterEncoding("UTF-8");
            // 輸出文件
            while ((length = inputStream.read(buf)) > 0) {
                outputStream.write(buf, 0, length);
            }
            inputStream.close();
            // 判斷:下載后是否同時刪除minio上的存儲文件
            if (BooleanUtils.isTrue(delete)) {
                minioClient.removeObject(RemoveObjectArgs.builder().bucket(this.bucketName).object(fileName).build());
            }
        } catch (Throwable ex) {
            response.setHeader("Content-type", "text/html;charset=UTF-8");
            String data = "文件下載失敗";
            try {
                OutputStream ps = response.getOutputStream();
                ps.write(data.getBytes("UTF-8"));
            }catch (IOException e){
                e.printStackTrace();
            }
        } finally {
            try {
            outputStream.close();
            if (inputStream != null) {
                    inputStream.close();
                }}catch (IOException e){
                e.printStackTrace();
            }
        }
    }


    /**
     * 查看文件對象
     * @param bucketName 存儲bucket名稱
     * @return 存儲bucket內(nèi)文件對象信息
     */
    public List<ObjectItem> listObjects(String bucketName) {
        Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
        List<ObjectItem> objectItems = new ArrayList<>();
        try {
            for (Result<Item> result : results) {
                Item item = result.get();

                ObjectItem objectItem = new ObjectItem();
                objectItem.setObjectName(item.objectName());
                objectItem.setSize(item.size());

                objectItems.add(objectItem);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return objectItems;
    }

    /**
     * 批量刪除文件對象
     * @param bucketName 存儲bucket名稱
     * @param objects 對象名稱集合
     */
    public Map<String, String> removeObjects(String bucketName, List<String> objects) {
        Map<String,String > resultMap = new HashMap<>();
        List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
        try {
             minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
            resultMap.put("mes","刪除成功");
        }catch (Exception e){
            e.printStackTrace();
            resultMap.put("mes","網(wǎng)絡(luò)異常,刪除失敗");
        }
        return resultMap;
    }

}




上傳文件名替換工具類:

public class FileUtils {

    /**
     * 編碼文件名
     * 日期路徑 + UUID
     * 示例:fileName=2022/11/18/統(tǒng)計報表1668758006562.txt
     */
    public static final String extractUploadFilename(MultipartFile file)
    {
        String fileName = file.getOriginalFilename();
        // 注意,這里需要加上 \\ 將 特殊字符 . 轉(zhuǎn)意 \\. ,否則異常
        String[] fileArray = fileName.split("\\.");
        fileName = datePath() + "/" + fileArray[0]+System.currentTimeMillis()+"."+fileArray[1];
        return fileName;
    }

    /**
     * 日期路徑 即年/月/日 如2018/08/08
     */
    public static final String datePath() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }
}



controller層:

@RestController
public class MinioController {

    @Autowired
    private MinioTemplate minioTemplate;

    @Value("${minio.server}")
    private String server;

    @Value("${minio.port}")
    private Integer port;

    @Value("${minio.bucket}")
    private String bucket;


    /**
     * 單文件上傳
     * @param file 文件
     * @return
     */
    @PostMapping("/uploadone")
    public Object uploadOne(MultipartFile file) {
        return minioTemplate.upload(file);
    }

    /**
     *  單文件下載
     * @param fileName 文件
     * @param delete 下載完后是否刪除, 請謹(jǐn)慎傳參
     */
    @GetMapping("/download")
    public void download(@RequestParam(value = "fileName") String fileName,
                         @RequestParam(defaultValue = "false")Boolean delete, HttpServletResponse response) {
        minioTemplate.fileDownload(fileName,delete,response);
    }

    /**
     * 查看存儲的文件列表
     * @param bucket 桶
     * @return
     */
    @GetMapping("/list")
    public  Object fileList(@RequestParam(value = "bucket") String bucket) {
        return minioTemplate.listObjects(bucket);
    }

    /**
     * 刪除文件
     * @param bucket 桶
     * @param list 文件名列表
     * @return
     */
    @DeleteMapping ("/remove")
    public  Object fileremove(@RequestParam String bucket,@RequestParam List<String> list) {
        return minioTemplate.removeObjects(bucket,list);
    }

}



接下來就是用postman測試,非常便利:測試存儲文檔、表格、日志、視頻、音頻、圖片等上傳、下載:
minio springboot,java中間件,spring boot,java,docker,后端
以上就是minio入門的所有內(nèi)容
更多可參考官網(wǎng)文檔:鏈接: https://min.io/docs/minio/kubernetes/upstream/
如果對源碼感興趣可以訪問:鏈接: https://github.com/minio/minio文章來源地址http://www.zghlxwxcb.cn/news/detail-776666.html

到了這里,關(guān)于SpringBoot集成Minio實(shí)戰(zhàn)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Minio入門系列【5】JAVA集成Minio之存儲桶操作API使用詳解

    Minio入門系列【5】JAVA集成Minio之存儲桶操作API使用詳解

    官方文檔:https://min.io/docs/minio/kubernetes/upstream/index.html?ref=docs-redirect SDK:https://github.com/minio/minio-java Minio 提供了多種語言的SDK,比如java、go、python等。JAVA開發(fā)平臺可以選擇JS和java SDK,也就是前端和后端都可以直接集成minio。 每個OSS的用戶都會用到上傳服務(wù)。Web端常見的上傳

    2024年02月05日
    瀏覽(29)
  • SpringBoot+MinIO實(shí)現(xiàn)minio部署和使用

    SpringBoot+MinIO實(shí)現(xiàn)minio部署和使用

    Minio是一個go編寫基于Apache License v2.0開源協(xié)議的對象存儲系統(tǒng),是為海量數(shù)據(jù)存儲、人工智能、大數(shù)據(jù)分析而設(shè)計,它完全兼容Amazon S3接口,十分符合存儲大容量的非結(jié)構(gòu)化數(shù)據(jù)從幾十kb到最大5T不等。是一個小而美的開源分布式存儲軟件。 特點(diǎn) 簡單、可靠:Minio采用簡單可靠

    2024年02月13日
    瀏覽(18)
  • MinIO安裝配置訪問以及SpringBoot整合MinIO

    MinIO安裝配置訪問以及SpringBoot整合MinIO

    詳細(xì)介紹了如何在CentOS7和Windows系統(tǒng)上安裝配置MinIO對象存儲服務(wù),并提供了SpringBoot項(xiàng)目與MinIO整合的步驟,幫助開發(fā)者快速實(shí)現(xiàn)文件的上傳、下載與管理。

    2024年02月04日
    瀏覽(20)
  • springboot整合minio

    springboot整合minio

    minio是對象存儲服務(wù)。 它基于Apache License 開源協(xié)議,兼容Amazon S3云存儲接口。適合存儲非結(jié)構(gòu)化數(shù)據(jù),如圖片,音頻,視頻,日志等。對象文件最大可以達(dá)到5TB。 優(yōu)點(diǎn)有高性能,可擴(kuò)展,操作簡單,有圖形化操作界面,讀寫性能優(yōu)異等。 minio的安裝也很簡單,有興趣的可以去

    2024年02月07日
    瀏覽(19)
  • Minio安裝及整合SpringBoot

    Minio安裝及整合SpringBoot

    一. MinIO概述 官網(wǎng)地址:https://minio.org.cn MinIO是一款基于Apache License v2.0開源協(xié)議的分布式文件系統(tǒng)(或者叫對象存儲服務(wù)),可以做為云存儲的解決方案用來保存海量的圖片、視頻、文檔等。由于采用Golang實(shí)現(xiàn),服務(wù)端可以工作在Windows、Linux、 OS X和FreeBSD上。配置簡單,基本

    2024年01月19日
    瀏覽(19)
  • SpringBoot3整合MinIO

    配套視頻:SpringBoot3整合MinIO MinIO項(xiàng)目應(yīng)用可參考視頻 【SpringBoot3+Vue3+Uniapp小程序項(xiàng)目實(shí)戰(zhàn)】 MinIO 是一個基于 Apache License v2.0 開源協(xié)議的對象存儲服務(wù)。它兼容亞馬遜 S3 云存儲服務(wù)接口,非常適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器

    2024年02月21日
    瀏覽(22)
  • springboot 本地/minio 附件下載優(yōu)化

    springboot 本地/minio 附件下載優(yōu)化

    本地上傳大文件內(nèi)存溢出 Direct buffer memory 附件下載服務(wù)端傳流給前端需要將流緩存完畢才可以下載,導(dǎo)致大文件下載系統(tǒng)崩潰 后端服務(wù)采用nio本地上傳到服務(wù)器指定目錄,通過nginx代理提供下載 Java8出現(xiàn)了NIO,緩存,通道,選擇器。在 寫NIO程序的時候,經(jīng)常使用ByteBuffer來讀

    2024年02月07日
    瀏覽(20)
  • springboot實(shí)現(xiàn)minio文件分片上傳

    在Spring Boot中實(shí)現(xiàn)MinIO的文件分片上傳涉及到幾個關(guān)鍵步驟。MinIO是一個高性能的分布式對象存儲服務(wù),它兼容Amazon S3的API。分片上傳主要用于上傳大文件,將大文件分成多個部分,分別上傳,最后再將這些部分合并成一個完整的文件。這樣做的好處是提高了上傳的可靠性,并

    2024年01月17日
    瀏覽(24)
  • springboot實(shí)現(xiàn)文件上傳到minio

    一、前言 最近在項(xiàng)目中用的使用minio來上傳文件,因此在這里給告訴大家如何實(shí)現(xiàn) 二、實(shí)現(xiàn)文件上傳至minio 1.添加相關(guān)的maven依賴 2.minio連接配置 (1)首先配置minio屬性 (2)接著配置minio連接,代碼如下: (3)在YAML添加minio配置 3.定義minio工具類,代碼如下: 4.編寫實(shí)現(xiàn)文件

    2024年02月09日
    瀏覽(27)
  • SpringBoot整合minio服務(wù)(超詳細(xì))

    SpringBoot整合minio服務(wù)(超詳細(xì))

    創(chuàng)建一個名為public的存儲桶(名字可自定義),上傳文件。 通過 http://ip:9000/存儲桶名/文件名 訪問文件 若出現(xiàn): 可以將存儲桶的訪問權(quán)限設(shè)置為public. 在application.yml文件中編寫相關(guān)配置。 開發(fā)中上傳接口用得較多,其他接口可自行測試。? # npm下載element-ui npm install element-

    2024年02月08日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包