【SpringBoot】-- 使用minio对象存储服务实现上传图片

目录

一、安装minio

拉取镜像

启动

查看

进入登录页面

创建bucket

二、安装miniomc

三、代码

application.yml

MinioUtil

Controller

四、拓展


以下基于云服务和docker使用minio服务

一、安装minio

Minio 是一个开源的对象存储服务器。它允许用户在私有云环境中建立自己的对象存储解决方案,同时保持易用性、高可用性和可扩展性。

拉取镜像

docker pull minio/minio

启动

docker run -p 9000:9000 -p 9090:9090 \
 --name minio \
 -d --restart=always \
 -e "MINIO_ACCESS_KEY=minioadmin" \
 -e "MINIO_SECRET_KEY=minioadmin" \
 -v /mydata/minio/data:/data \
 minio/minio server \
 /data --console-address ":9090" -address ":9000"

查看

docker ps -a

(服务器防火墙添加9000和9090端口)

进入登录页面

输入ip:9090进入登录页面

账号密码是上面启动时的账号密码

创建bucket

二、安装miniomc

目前的minio上传的文件有七天的有效时间,现在需要安装miniomc使其永久有效

docker pull minio/mc

docker run -it --entrypoint=/bin/sh minio/mc


mc config host add minio http://你的ip:9000 [Access key] [Secret Key]

mc ls minio

mc anonymous

mc anonymous set download minio/xxx

xxx是桶的名称

三、代码

application.yml

server:
  port: 4000
minio:
  url: http://你的ip:9000
  accessKey: minioadmin
  secretKey: minioadmin

MinioUtil

工具类

@Component
public class MinioUtil {

    @Resource
    private MinioClient minioClient;

    /**
     * 创建bucket桶
     */
    public void createBucket(String bucket) throws Exception {
        boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if (!exists) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }

    /**
     * 上传文件
     */
    public void uploadFile(InputStream inputStream, String bucket, String objectName) throws Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
                .stream(inputStream, -1, 5242889L).build());
    }

    /**
     * 列出所有桶
     */
    public List<String> getAllBucket() throws Exception {
        List<Bucket> buckets = minioClient.listBuckets();
        return buckets.stream().map(Bucket::name).collect(Collectors.toList());
    }

    /**
     * 列出当前桶及文件
     */
    public List<FileInfo> getAllFile(String bucket) throws Exception {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucket).build());
        List<FileInfo> fileInfoList = new LinkedList<>();
        for (Result<Item> result : results) {
            FileInfo fileInfo = new FileInfo();
            Item item = result.get();
            fileInfo.setFileName(item.objectName());
            fileInfo.setDirectoryFlag(item.isDir());
            fileInfo.setEtag(item.etag());
            fileInfoList.add(fileInfo);
        }
        return fileInfoList;
    }

    /**
     * 下载文件
     */
    public InputStream downLoad(String bucket, String objectName) throws Exception {
        return minioClient.getObject(
                GetObjectArgs.builder().bucket(bucket).object(objectName).build()
        );
    }

    /**
     * 删除桶
     */
    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()
        );
    }

    /**
     * 获取文件url
     */
    public String getPreviewFileUrl(String bucketName, String objectName) throws Exception{
            GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName).object(objectName).build();
            return minioClient.getPresignedObjectUrl(args);
    }

}

Controller

请求参数:

bucket:桶的名称

objectName:桶下的文件夹的名称

 @Resource
    private MinioUtil minioUtil;

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


    /**
     * 上传文件
     */
    @RequestMapping("/upload")
    public String upload(MultipartFile uploadFile, String bucket, 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());
        }
        objectName = objectName + "/" + uploadFile.getOriginalFilename();
        return url + "/" + bucket + "/" + objectName;
    }

四、拓展

MinioUtil工具类里还有下载文件等方法,可以用。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我理解了你的问题。如果你想在 SpringBoot 应用中使用 Minio 作为云存储服务,可以按照以下步骤进行操作: 1. 添加 Minio 客户端依赖 在 `pom.xml` 文件中添加 Minio 客户端依赖: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.1</version> </dependency> ``` 2. 配置 Minio 客户端 在 `application.properties` 文件中添加以下配置: ```properties minio.url=http://localhost:9000 minio.access-key=minio minio.secret-key=minio123 minio.bucket-name=my-bucket ``` 其中,`minio.url` 是 Minio 服务的访问地址,`minio.access-key` 和 `minio.secret-key` 是访问 Minio 服务的凭证,`minio.bucket-name` 是存储对象的桶名称。 3. 实现上传文件接口 ```java @RestController public class FileController { @Autowired private MinioClient minioClient; @PostMapping("/files") public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception { String fileName = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); long size = file.getSize(); String contentType = file.getContentType(); minioClient.putObject(PutObjectArgs.builder() .bucket("my-bucket") .object(fileName) .stream(inputStream, size, -1) .contentType(contentType) .build()); return "File uploaded successfully: " + fileName; } } ``` 4. 实现展示图片接口 ```java @RestController public class ImageController { @Autowired private MinioClient minioClient; @GetMapping("/images/{fileName}") public ResponseEntity<byte[]> getImage(@PathVariable String fileName) throws Exception { InputStream inputStream = minioClient.getObject(GetObjectArgs.builder() .bucket("my-bucket") .object(fileName) .build()); byte[] bytes = IOUtils.toByteArray(inputStream); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_JPEG); headers.setContentLength(bytes.length); return new ResponseEntity<>(bytes, headers, HttpStatus.OK); } } ``` 在这个示例中,我们定义了一个 `FileController` 和一个 `ImageController`,分别用于上传文件和展示图片。其中,`ImageController` 中的 `getImage` 方法根据文件名从 Minio 服务中获取图片,并返回 `ResponseEntity<byte[]>` 对象,该对象包含图片的二进制数据和响应头信息,用于在浏览器中展示图片。 以上就是在 SpringBoot 应用中使用 Minio 作为云存储服务的步骤。希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天行健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值