Minio 和 x-file-storage -2025/7/9

Minio

官网地址 : https://docs.min.io/enterprise/aistor-object-store/

minio可以用来存储文件, 可以存储再虚拟机上 , 是存储在阿里云oss上的一个平替方案

我们在地址栏输入:http://192.168.200.128:9001/ 即可进入登录界面

192.168.200.128 是我们虚拟机ip地址

前提是虚拟机上需要使用docker部署 minio

java中如何使用

  1. 添加依赖
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

<!--  文件存储-->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.1.0</version>
</dependency>
  1. 添加配置
minio:
  accessKey: minio
  secretKey: minio123
  bucket: dkd
  endpoint: http://192.168.200.128:9001
  readPath: http://192.168.200.128:9001 
  1. 创建MinIOConfig配置类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties("minio")
@Data
public class MinIOConfig {
    private String accessKey;
    private String secretKey;
    private String bucket;
    private String endpoint;
    private String readPath;
    @Bean
    public MinioClient buildMinioClient(){
        return MinioClient
                .builder()
                .credentials(accessKey,secretKey)
                .endpoint(endpoint)
                .build();
    }
}
  1. 创建工具类
import com.dkd.common.config.MinIOConfig;
import com.dkd.common.exception.ServiceException;
import com.dkd.common.utils.StringUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
封装minio客户端方法
上传文件
*/
@Slf4j
@Component
public class MinIOUtils{
    @Autowired
    private MinIOConfig minIOConfig;
    @Autowired
    private MinioClient minioClient;

    /**
     * 上传文件到MinIO
     *
     * @param file
     * @throws NoSuchAlgorithmException
     * @throws IOException
     * @throws InvalidKeyException
     */
    public String uploadFile(MultipartFile file) {
        try {
            String newFileName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString() +
                    "." +
                    StringUtils.substringAfterLast(file.getOriginalFilename(), ".");

            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(newFileName)
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(), file.getSize(), -1)  // partSize -1表示整体(不分片)上传
                    .bucket(minIOConfig.getBucket())
                    .build();
            minioClient.putObject(putObjectArgs);
            StringBuilder stringBuilder = new StringBuilder(minIOConfig.getReadPath());
            stringBuilder.
                    append("/").
                    append(minIOConfig.getBucket()).
                    append("/").
                    append(newFileName);
            return stringBuilder.toString();
        } catch (Exception ex) {
            log.error("minio put file error.", ex);
            throw new ServiceException("上传文件失败");
        }
    }
}

x-file-storage

官方地址:https://x-file-storage.xuyanwu.cn/#/

官网介绍:
一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿里云 OSS、华为云 OBS、七牛云 Kodo、腾讯云 COS、百度云 BOS、又拍云 USS、MinIO、 Amazon S3、GoogleCloud Storage、FastDFS、 Azure Blob Storage、Cloudflare R2、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动 云EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的存储平台。

如果以后需要切换文件存储平台 只需要导入依赖 改配置文件即可

使用

  1. 导入依赖
<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>2.1.0</version>
</dependency>
  1. 配置文件

dromara:
  x-file-storage: #文件存储配置
    default-platform: minio-1 #默认使用的存储平台
    thumbnail-suffix: ".min.jpg" #缩略图后缀,例如【.min.jpg】【.png】
    #对应平台的配置写在这里,注意缩进要对齐
    minio:
      - platform: minio-1 # 存储平台标识
        enable-storage: true  # 启用存储
        access-key: minio
        secret-key: minio123
        end-point: http://192.168.200.128:9001
        bucket-name: dkd
        domain: http://192.168.200.128:9001/dkd/ # 访问域名,注意“/”结尾,例如:http://minio.abc.com/abc/
        base-path: images/ # 基础路径
  1. 在启动类上加上@EnableFileStorage注解
@EnableFileStorage
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class DkdApplication
{
    public static void main(String[] args)
    {
        // System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(DkdApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  帝可得启动成功   ლ(´ڡ`ლ)゙");
    }
}
  1. 使用实例
@Autowired
private FileStorageService fileStorageService;

/**
 * 通用上传请求(单个)
 */
@PostMapping("/upload")
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
    try
    {
        // 指定minio保存文件路径
        String objectName = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")) + "/";
        // 上传图片,成功返回文件信息
        FileInfo fileInfo = fileStorageService.of(file).setPath(objectName).upload();
        // 设置返回结果
        AjaxResult ajax = AjaxResult.success();
        ajax.put("url", fileInfo.getUploadId());
        ajax.put("fileName", fileInfo.getUrl());//注意:这里的值要改为url,前端访问的文件名,需要文件的地址 而不是文件名称
        ajax.put("newFileName", FileUtils.getName(fileInfo.getUrl()));
        ajax.put("originalFilename", file.getOriginalFilename());
        return ajax;
    }
    catch (Exception e)
    {
        return AjaxResult.error(e.getMessage());
    }
}
posted @ 2025-07-09 17:18  XYu1230  阅读(185)  评论(0)    收藏  举报