对象存储服务OSS(Object Storage Service)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。
安装minio
1、进入官网:https://min.io/
我目前安装的是版本是:
在cmd窗口中,命令行进行minio.exe所在的文件夹,输入如下命令 server后面的地址是你图片上传之后的存储目录
minio.exe server E:\minio
因为这里api端口是9000
,所以下面的yml需要配置9000
端口
accessKey
和secretKey
需要根据启动的窗口上的值进行配置bucketName
这个需要自己创建
2、启动成功后,访问:127.0.0.1:9000/minio
,可以进入到minio的控制台
我们可以在控制台创建bucketName
,当然也可以用代码创建
create bucket
其实这个bucketName
就是文件夹的意思,我们要把文件上传到哪个bucketName
,就是要把文件上传到对应的目录下。
如果需要使用minio,他的服务一定要打开。
依赖
<!--minio--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.0.3</version></dependency>
yml配置
spring:# 配置文件上传大小限制
servlet:
multipart:
max-file-size: 200MB
max-request-size: 200MB
minio:
endpoint: http://127.0.0.1:9000
accessKey: minioadmin
secretKey: minioadmin
bucketName:test
写配置类
注册minio客户端,以便在代码中使用客户端上传文件。
@Data
@Component
public class MinIoClientConfig{
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
/**
* 注入minio 客户端
* @return
*/
@Bean
public MinioClientminioClient(){return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();}}
工具类
实体类:
@Data
public class ObjectItem{
private String objectName;
private Long size;}
/**
* @description: minio工具类
* @version:3.0
*/
@Component
public class MinioUtilS{
@Autowired
private MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
/**
* description: 判断bucket是否存在,不存在则创建
*
* @return: void
*/
public void existBucket(String name){
try{
boolean exists= minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());if(!exists){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());}} catch(Exception e){
e.printStackTrace();}}
/**
* 创建存储bucket
* @param bucketName 存储bucket名称
* @return Boolean
*/
public Boolean makeBucket(String bucketName){
try{
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());} catch(Exception e){
e.printStackTrace();returnfalse;}returntrue;}
/**
* 删除存储bucket
* @param bucketName 存储bucket名称
* @return Boolean
*/
public Boolean removeBucket(String bucketName){
try{
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());} catch(Exception e){
e.printStackTrace();returnfalse;}returntrue;}
/**
* description: 上传文件
*
* @param multipartFile
* @return: java.lang.String
*/
public List<String> upload(MultipartFile[] multipartFile){
List<String> names= new ArrayList<>(multipartFile.length);for(MultipartFilefile: multipartFile){
String fileName= file.getOriginalFilename();
String[]split= fileName.split("\\.");if(split.length>1){
fileName= split[0] +"_" + System.currentTimeMillis() +"." + split[1];}else{
fileName= fileName + System.currentTimeMillis();}
InputStreamin= null;
try{in= file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(in, in.available(), -1)
.contentType(file.getContentType())
.build());} catch(Exception e){
e.printStackTrace();} finally{if(in!= null){
try{
in.close();} catch(IOException e){
e.printStackTrace();}}}
names.add(fileName);}return names;}
/**
* description: 下载文件
*
* @param fileName
* @return: org.springframework.http.ResponseEntity<byte[]>
*/
public ResponseEntity<byte[]> download(String fileName){
ResponseEntity<byte[]> responseEntity= null;
InputStreamin= null;
ByteArrayOutputStream out= null;
try{in= minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
out= new ByteArrayOutputStream();
IOUtils.copy(in, out);
//封装返回值
byte[] bytes= out.toByteArray();
HttpHeaders headers= new HttpHeaders();
try{
headers.add("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));} catch(UnsupportedEncodingException e){
e.printStackTrace();}
headers.setContentLength(bytes.length);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setAccessControlExposeHeaders(Arrays.asList("*"));
responseEntity= new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);} catch(Exception e){
e.printStackTrace();} finally{
try{if(in!= null){
try{
in.close();} catch(IOException e){
e.printStackTrace();}}if(out!= null){
out.close();}} catch(IOException e){
e.printStackTrace();}}return responseEntity;}
/**
* 查看文件对象
* @param bucketName 存储bucket名称
* @return 存储bucket内文件对象信息
*/
public List<ObjectItem> listObjects(String bucketName){
Iterable<Result<Item>> results= minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).build());
List<ObjectItem> objectItems= new ArrayList<>();
try{for(Result<Item> result: results){
Item item= result.get();
ObjectItem objectItem= new ObjectItem();
objectItem.setObjectName(item.objectName());
objectItem.setSize(item.size());
objectItems.add(objectItem);}} catch(Exception e){
e.printStackTrace();return null;}return objectItems;}
/**
* 批量删除文件对象
* @param bucketName 存储bucket名称
* @param objects 对象名称集合
*/
public Iterable<Result<DeleteError>> removeObjects(String bucketName, List<String> objects){
List<DeleteObject> dos= objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
Iterable<Result<DeleteError>> results= minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());return results;}}
控制器
@RestController
@Slf4j
public class MinioController{
@Autowired
private MinIoUtil minIoUtil;
@Autowired
private MinioUtilS minioUtilS;
@Value("${minio.endpoint}")
private String address;
@Value("${minio.bucketName}")
private String bucketName;
@PostMapping("/upload")
public Object upload(MultipartFilefile){
List<String> upload= minioUtilS.upload(new MultipartFile[]{file});return address+"/"+bucketName+"/"+upload.get(0);}}
成功上传: