从零搭建云点播系统(二):Windows下安装MinIO以及Spring Boot接入的详细教程

发布于:2025-05-29 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、Windows下安装MinIO

方法1:通过可执行文件安装
  1. 下载MinIO Server

  2. 创建数据存储目录

    • 新建一个文件夹用于存储MinIO数据,例如:D:\minio\data

  3. 启动MinIO Server

    • 打开命令提示符(CMD)或PowerShell,执行以下命令:

      minio.exe server D:\minio\data --console-address :9090
    • --console-address :9090 指定控制台端口为9090(默认API端口为9000)。

    • 报错解决:

      setx MINIO_ROOT_USER minioadmin 
      setx MINIO_ROOT_PASSWORD minioadmin 
      FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials
            > Please provide correct credentials
            HINT:
              MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters
  4. 访问MinIO控制台

    • 打开浏览器,访问:http://localhost:9090

    • 默认账号密码:minioadmin / minioadmin


方法2:通过PowerShell安装(推荐)
  1. 下载并运行安装脚本

    Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio\minio.exe"
  2. 启动MinIO

    C:\minio\minio.exe server D:\minio\data --console-address :9090

二、Spring Boot接入MinIO

1. 添加依赖

在 pom.xml 中添加以下依赖:

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.7</version>
</dependency>
<!-- 或使用Amazon S3 SDK(推荐) -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.12.590</version>
</dependency>

2. 配置MinIO连接信息

创建存储桶并配置访问密钥。

在 application.properties 或 application.yml 中添加配置:

# MinIO配置
minio.endpoint=http://localhost:9000
minio.access-key=minioadmin
minio.secret-key=minioadmin
minio.bucket-name=mybucket

3. 创建MinIO配置类
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
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.endpoint}")
    private String endpoint;

    @Value("${minio.access-key}")
    private String accessKey;

    @Value("${minio.secret-key}")
    private String secretKey;

    @Bean
    public AmazonS3 amazonS3() {
        return AmazonS3ClientBuilder.standard()
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, ""))
                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
                .withPathStyleAccessEnabled(true) // 必须启用路径风格访问
                .build();
    }
}

4. 实现文件上传/下载功能
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@Service
public class MinioService {

    @Autowired
    private AmazonS3 amazonS3;

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

    // 创建存储桶
    public void createBucket() {
        if (!amazonS3.doesBucketExistV2(bucketName)) {
            amazonS3.createBucket(bucketName);
        }
    }

    // 上传文件
    public String uploadFile(MultipartFile file) throws IOException {
        File convertedFile = convertMultiPartToFile(file);
        PutObjectResult result = amazonS3.putObject(bucketName, file.getOriginalFilename(), convertedFile);
        convertedFile.delete();
        return "File uploaded: " + file.getOriginalFilename();
    }

    // 下载文件
    public byte[] downloadFile(String fileName) {
        return amazonS3.getObject(bucketName, fileName).getObjectContent().readAllBytes();
    }

    // 删除文件
    public void deleteFile(String fileName) {
        amazonS3.deleteObject(bucketName, fileName);
    }

    private File convertMultiPartToFile(MultipartFile file) throws IOException {
        File convFile = new File(file.getOriginalFilename());
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
    }
}

5. 创建Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/api/files")
public class FileController {

    @Autowired
    private MinioService minioService;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            return minioService.uploadFile(file);
        } catch (Exception e) {
            return "Upload failed: " + e.getMessage();
        }
    }

    @GetMapping("/download/{fileName}")
    public ResponseEntity<byte[]> downloadFile(@PathVariable String fileName) {
        byte[] data = minioService.downloadFile(fileName);
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(data);
    }
}

三、验证测试

  1. 启动Spring Boot应用。

  2. 使用Postman或浏览器测试:

    • 上传文件POST http://localhost:8080/api/files/upload

    • 下载文件GET http://localhost:8080/api/files/download/{fileName}


网站公告

今日签到

点亮在社区的每一天
去签到