简介
最近在写项目的时候,使用了富文本编辑器wangEditor,其中有一个功能是图片上传,因为之前已经有一个搭建好的MinIO服务且提供了Java SDK,在实现这个功能的时候也踩了一下坑,将该功能记录如下。
整合wangEditor
在Thymeleaf中整合wangEditor需要js文件,我使用的是CDN引入
wangEditor demo
欢迎使用 wangEditor 富文本编辑器
SpringBoot整合MinIO
- 加入MinIO依赖
io.minio
minio
3.0.10
- 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
。
- 文件上传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);
}
}
遇到的问题
- 文件已上传到MinIO,但在编辑器中回显失败
原因:没有配置存储桶策略或存储桶策略配置错误
目前了解到有3种方式修改存储桶策略:
- 通过MinIO管理端手动修改存储桶策略
- 通过MinIO对应的客户端工具
mc
- 在创建存储桶时,指定策略
client.setBucketPolicy(bucketName, "*", PolicyType.READ_ONLY);