1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/WangFuGui-Ma-spring-boot-minio

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 02:18 20243d7

Установка MinIO

Если у вас ещё не установлен MinIO, пожалуйста, ознакомьтесь с инструкцией по установке: «Linux установка MinIO (подробное описание с картинками)».

Последняя версия SpringBoot

От скуки написал minio-spring-boot-starter для общего пользования. https://blog.csdn.net/csdnerM/article/details/137999933

Пожалуйста, используйте последнюю версию.

Интеграция Springboot и MinIO

Сначала давайте разберёмся, что такое MinIO: MinIO — это объектный сервис хранения данных с открытым исходным кодом, основанный на Apache License v2.0. Он совместим с облачным сервисом Amazon S3 и хорошо подходит для хранения больших объёмов неструктурированных данных, таких как изображения, видео, файлы журналов, резервные копии данных и образы контейнеров/виртуальных машин. Файлы объектов могут быть любого размера, от нескольких килобайт до максимум 5 терабайт. Затем хочу поблагодарить spring-minio за предоставленную идею. Это обновление содержит некоторые дополнения к API SDK.

Шаг 1. Импортируем jar-пакет MinIO

         <!--minio-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.2.0</version>
        </dependency>
        <!--minio-->

Шаг 2. Создаём класс конфигурации

package com.wangfugui.apprentice.config;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfig {
    
    @Value("${minio.url}")
    private String url;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(url)
                .credentials(accessKey, secretKey).build();
    }
    
}

Цель этого шага — внедрить MinioClient в контейнер Spring для последующего использования.

Шаг 3. Создаём util-класс

package com.wangfugui.apprentice.common.util;

import com.wangfugui.apprentice.dao.dto.Fileinfo;
import io.minio.BucketExistsArgs;
import io.minio.CopyObjectArgs;
import io.minio.CopySource;
import io.minio.GetObjectArgs;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.ListObjectsArgs;
import io.minio.MakeBucketArgs;
import io.minio.RemoveBucketArgs;
import io.minio.RemoveObjectArgs;
import io.minio.StatObjectArgs;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

@Component
public class MinioUtil {
    @Autowired
    private MinioClient minioClient;
    
    /**
     * Создание корзины
     */
    public void createBucket(String bucket) throws Exception {
        boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!found) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }
    
    /**
     * Загрузка файла
     */
    public void uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
                .stream(stream, -1, 10485760).build());
    }
    
    /**
     * Список всех корзин
     */
    public List<String> listBuckets() throws Exception {
        List<Bucket> list = minioClient.listBuckets();
        List<String> names = new ArrayList<>();
        list.forEach(b -> {
            names.add(b.name());
        });
        return names;
    }
    
    /**
     * Список файлов и каталогов в корзине
     */
    public List<Fileinfo> listFiles(String bucket) throws Exception {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucket).recursive(true).build());
            
            List<Fileinfo> infos = new ArrayList<>();
                results.forEach(r->{
                    Fileinfo info = new Fileinfo();
                    try {
                        Item item = r.get();
                        info.setFilename(item.objectName());
                        info.setDirectory(item.isDir());
                        infos.add(info);
                    } catch (Exception e) {

...
``` Вот перевод текста на русский язык:

e.printStackTrace(); } }); return infos; }

/**
 * Скачать файл
 */
public InputStream download(String bucket, String objectName) throws Exception {
    InputStream stream = minioClient.getObject(
                  GetObjectArgs.builder().bucket(bucket).object(objectName).build());
    return stream;
}

/**
 * Удалить ведро
 */
public void deleteBucket(String bucket) throws Exception {
    minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
}

/**
 * Удалить объект
 */
public void deleteObject(String bucket, String objectName) throws Exception {
    minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());
}


/**
 * Скопировать файл
 *
 * @Param: [sourceBucket, sourceObject, targetBucket, targetObject]
 * @return: void
 * @Author: MrFugui
 * @Date: 2021/11/15
 */
public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) throws Exception {
    this.createBucket(targetBucket);
    minioClient.copyObject(CopyObjectArgs.builder().bucket(targetBucket).object(targetObject)
            .source(CopySource.builder().bucket(sourceBucket).object(sourceObject).build()).build());
}

/**
 * Получить информацию о файле
 *
 * @Param: [bucket, objectName]
 * @return: java.lang.String
 * @Author: MrFugui
 * @Date: 2021/11/15
 */
public String getObjectInfo(String bucket, String objectName) throws Exception {

    return minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(objectName).build()).toString();

}

/**
 * Создать предподписанный URL для HTTP GET запроса. Браузер или мобильное приложение могут использовать этот URL для скачивания, даже если хранилище приватное.
 *
 * @Param: [bucketName, objectName, expires]
 * @return: java.lang.String
 * @Author: MrFugui
 * @Date: 2021/11/15
 */
public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
    GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
            .builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();
    return minioClient.getPresignedObjectUrl(build);
}

/**
 * Получить все файлы из minio
 *
 * @Param: []
 * @return: java.util.List<boot.spring.domain.Fileinfo>
 * @Author: MrFugui
 * @Date: 2021/11/15
 */
public List<Fileinfo> listAllFile() throws Exception {
    List<String> list = this.listBuckets();
    List<Fileinfo> fileinfos = new ArrayList<>();
    for (String bucketName : list) {
        fileinfos.addAll(this.listFiles(bucketName));
    }


    return fileinfos;
}

}

Здесь интегрированы API из minio SDK. Это документация по API minio

Четвёртый шаг, написание класса контроллера

package com.wangfugui.apprentice.controller;

import com.wangfugui.apprentice.common.util.MinioUtil;
import com.wangfugui.apprentice.common.util.ResponseUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;

@Api(tags = "Файл операции интерфейс")
@RestController
@RequestMapping(value = "/file")
public class FileController {

    @Autowired
    MinioUtil minioUtil;

    @ApiOperation("Загрузить файл")
    @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
    public ResponseUtils fileupload(@RequestParam MultipartFile
``` Данный текст написан на языке Java.

uploadFile, @RequestParam String bucket,  
                                    @RequestParam(required = false) String objectName) throws Exception {  
    minioUtil.createBucket(bucket);  
    if (objectName != null) {  
        minioUtil.uploadFile(uploadfile.getInputStream(), bucket, objectName + "/" + uploadfile.getOriginalFilename());  
    } else {  
        minioUtil.uploadFile(uploadfile.getInputStream(), bucket, uploadfile.getOriginalFilename());  
    }  
    return ResponseUtils.success();  
}

@ApiOperation("列出所有的桶")  
@RequestMapping(value = "/listBuckets", method = RequestMethod.GET)  
public ResponseUtils listBuckets() throws Exception {  
    return ResponseUtils.success(minioUtil.listBuckets());  
}

@ApiOperation("递归列出一个桶中的所有文件和目录")  
@RequestMapping(value = "/listFiles", method = RequestMethod.GET)  
public ResponseUtils listFiles(@RequestParam String bucket) throws Exception {  
    return ResponseUtils.success(minioUtil.listFiles(bucket));  
}

@ApiOperation("下载一个文件")  
@RequestMapping(value = "/downloadFile", method = RequestMethod.GET)  
public void downloadFile(@RequestParam String bucket, @RequestParam String objectName,  
                             HttpServletResponse response) throws Exception {  
    InputStream stream = minioUtil.download(bucket, objectName);  
    ServletOutputStream output = response.getOutputStream();  
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(objectName.substring(objectName.lastIndexOf("/") + 1), "UTF-8"));  
    response.setContentType("application/octet-stream");  
    response.setCharacterEncoding("UTF-8");  
    IOUtils.copy(stream, output);  
}


@ApiOperation("删除一个文件")  
@RequestMapping(value = "/deleteFile", method = RequestMethod.GET)  
public ResponseUtils deleteFile(@RequestParam String bucket, @RequestParam String objectName) throws Exception {  
    minioUtil.deleteObject(bucket, objectName);  
    return ResponseUtils.success();  
}

@ApiOperation("删除一个桶")  
@RequestMapping(value = "/deleteBucket", method = RequestMethod.GET)  
public ResponseUtils deleteBucket(@RequestParam String bucket) throws Exception {  
    minioUtil.deleteBucket(bucket);  
    return ResponseUtils.success();  
}


@ApiOperation("复制一个文件")  
@GetMapping("/copyObject")  
public ResponseUtils copyObject(@RequestParam String sourceBucket, @RequestParam String sourceObject, @RequestParam String targetBucket, @RequestParam String targetObject) throws Exception {  
    minioUtil.copyObject(sourceBucket, sourceObject, targetBucket, targetObject);  
    return ResponseUtils.success();  
}

@GetMapping("/getObjectInfo")  
@ApiOperation("获取文件信息")  
public ResponseUtils getObjectInfo(@RequestParam String bucket, @RequestParam String objectName) throws Exception {

    return ResponseUtils.success(minioUtil.getObjectInfo(bucket, objectName));  
}

@GetMapping("/getPresignedObjectUrl")  
@ApiOperation("获取一个连接以供下载")  
public ResponseUtils getPresignedObjectUrl(@RequestParam String bucket, @RequestParam String objectName, @RequestParam Integer expires) throws Exception {

    return ResponseUtils.success(minioUtil.getPresignedObjectUrl(bucket, objectName, expires));  
}

@GetMapping("/listAllFile")  
@ApiOperation("获取minio中所有的文件")  
public ResponseUtils listAllFile() throws Exception {

    return ResponseUtils.success(minioUtil.listAllFile());  
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/WangFuGui-Ma-spring-boot-minio.git
git@api.gitlife.ru:oschina-mirror/WangFuGui-Ma-spring-boot-minio.git
oschina-mirror
WangFuGui-Ma-spring-boot-minio
WangFuGui-Ma-spring-boot-minio
master