基于MinIO Java SDK完成文件上传

简介

最近在写项目的时候,使用了富文本编辑器wangEditor,其中有一个功能是图片上传,因为之前已经有一个搭建好的MinIO服务且提供了Java SDK,在实现这个功能的时候也踩了一下坑,将该功能记录如下。

整合wangEditor

在Thymeleaf中整合wangEditor需要js文件,我使用的是CDN引入

    
    
    
        
        wangEditor demo
        
    
    
        

欢迎使用 wangEditor 富文本编辑器

SpringBoot整合MinIO

  1. 加入MinIO依赖
        
            io.minio
            minio
            3.0.10
        
  1. MinIO工具类
import io.minio.MinioClient;
import io.minio.errors.*;
import io.minio.policy.PolicyType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@Slf4j
@Component
public class MinIoService {

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

    @Value(value = "${minio.accessKey}")
    private String accessKey;

    @Value(value = "${minio.secretKey}")
    private String secretKey;

    /**
     * 获取MinioClient
     * @return
     * @throws InvalidPortException
     * @throws InvalidEndpointException
     */
    private MinioClient minioClient() throws InvalidPortException, InvalidEndpointException {
        return new MinioClient(url, accessKey, secretKey, true);
    }

    /**
     * minio文件上传
     *
     * @param bucketName  存储桶
     * @param fileName    文件名
     * @param inputStream 输入流
     * @param contentType 文件类型
     * @param size        文件大小
     * @return
     * @throws InvalidPortException
     * @throws InvalidEndpointException
     * @throws IOException
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     * @throws InsufficientDataException
     * @throws InvalidArgumentException
     * @throws InternalException
     * @throws NoResponseException
     * @throws InvalidBucketNameException
     * @throws XmlPullParserException
     * @throws ErrorResponseException
     * @throws RegionConflictException
     * @throws InvalidObjectPrefixException
     */
    public String uploadFile(String bucketName, String fileName, InputStream inputStream, String contentType, long size) throws InvalidPortException, InvalidEndpointException, IOException, InvalidKeyException, NoSuchAlgorithmException, InsufficientDataException, InvalidArgumentException, InternalException, NoResponseException, InvalidBucketNameException, XmlPullParserException, ErrorResponseException, RegionConflictException, InvalidObjectPrefixException {
        MinioClient client = minioClient();
        if (!client.bucketExists(bucketName)) {
            client.makeBucket(bucketName);
            // 设置存储桶策略
            client.setBucketPolicy(bucketName, "*", PolicyType.READ_ONLY);
        }
        client.putObject(bucketName, fileName, inputStream, size, contentType);
        return client.getObjectUrl(bucketName, fileName);
    }
}

有多种方式可以实例化MinioClient,具体请参考API,由于之前搭建MinIO是通过Nginx代理并配置了HTTPS,所以secure参数设置为空true

  1. 文件上传Controller
@Slf4j
@Controller
@RequestMapping(value = "resource")
public class ResourceController {

    @Autowired
    private ResourceService resourceService;

    @ResponseBody
    @PostMapping(value = "uploadResource")
    public Map uploadResource(@RequestParam(value = "file") MultipartFile file) {
        return resourceService.saveResource(file);
    }
}

遇到的问题

  1. 文件已上传到MinIO,但在编辑器中回显失败
原因:没有配置存储桶策略或存储桶策略配置错误

目前了解到有3种方式修改存储桶策略:

  • 通过MinIO管理端手动修改存储桶策略

基于MinIO Java SDK完成文件上传_第1张图片

  • 通过MinIO对应的客户端工具mc
  • 在创建存储桶时,指定策略
client.setBucketPolicy(bucketName, "*", PolicyType.READ_ONLY);

原文地址:https://www.haicheng.website/...

你可能感兴趣的:(java,oss,wangeditor,springboot)