Mio文件存储服务器的使用

我们在实际开发中都需要对用户信息进行存储,比如酷狗音乐存储音乐,而这需要一个单独的存储服务器,今天给大家介绍mio对象存储服务器的使用

0.加依赖

        <!--对象存储器--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version></dependency>

1.加yml配置(不知道怎么获取的可以看视频或者问chatGPT)

  #tomcat设置上传文件servlet:multipart:# tomcat允许上传的文件大小限制10Mmax-file-size: 10485760# 允许的最大请求大小max-request-size: 104857600minio:# 访问的urlendpoint: http://192.168.30.129# API的端口port: 9001# 秘钥accessKey: #你的秘钥secretKey: #你的秘钥keysecure: falsebucket-name: 大白猫     #桶名,这是给出了一个默认桶名image-size: 10485760   #我在这里设定了图片文件的最大大小file-size: 2073741824  #此处是设定了文件的最大大

2.设置一个配置对象获取yml的值进行bean的注入

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {/*** 端点*/private String endpoint;/*** 端口*/private Integer port;/*** 访问密钥*/private String accessKey;/*** 秘密密钥*/private String secretKey;/*** 安全*/private Boolean secure;/*** bucket存储桶名称*/private String bucketName;/*** 图像大小*/private Integer imageSize;/*** 文件大小*/private Integer fileSize;/*** 此类是 客户端进行操作的类*/@Beanpublic MinioClient minioClient(){return MinioClient.builder().credentials(accessKey,secretKey).endpoint(endpoint,port,secure).build();}
}

3.根据数据写一个工具类

@Component
public class MinioUtil {@Resourceprivate MinioClient minioClient;@Resourceprivate MinioProperties minioProperties;/*** 检查存储桶是否存在** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic boolean bucketExists(String bucketName) {return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());}/*** 创建存储桶** @param bucketName 存储桶名称*/@SneakyThrowspublic boolean makeBucket(String bucketName) {boolean flag = bucketExists(bucketName);if (!flag) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());return true;} else {return false;}}/*** 列出所有存储桶名称** @return*/@SneakyThrowspublic List<String> listBucketNames() {return listBuckets().stream().map(Bucket::name).collect(Collectors.toList());}/*** 列出所有存储桶** @return*/@SneakyThrowspublic List<Bucket> listBuckets() {return minioClient.listBuckets();}/*** 删除存储桶** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic boolean removeBucket(String bucketName) {boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<Item>> myObjects = listObjects(bucketName);for (Result<Item> result : myObjects) {Item item = result.get();// 有对象文件,则删除失败if (item.size() > 0) {return false;}}// 删除存储桶,注意,只有存储桶为空时才能删除成功。minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());flag = bucketExists(bucketName);if (!flag) {return true;}}return false;}/*** 列出存储桶中的所有对象名称** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic List<String> listObjectNames(String bucketName) {List<String> listObjectNames = new ArrayList<>();boolean flag = bucketExists(bucketName);if (flag) {Iterable<Result<Item>> myObjects = listObjects(bucketName);for (Result<Item> result : myObjects) {Item item = result.get();listObjectNames.add(item.objectName());}} else {listObjectNames.add("存储桶不存在");}return listObjectNames;}/*** 列出存储桶中的所有对象** @param bucketName 存储桶名称* @return*/@SneakyThrowspublic Iterable<Result<Item>> listObjects(String bucketName) {boolean flag = bucketExists(bucketName);if (flag) {return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());}return null;}/*** 文件上传** @param bucketName* @param multipartFile*/@SneakyThrowspublic void putObject(String bucketName, MultipartFile multipartFile, String filename, String fileType) {InputStream inputStream = new ByteArrayInputStream(multipartFile.getBytes());minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filename).stream(inputStream, -1, minioProperties.getFileSize()).contentType(fileType).build());}/*** 文件访问路径** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return*/@SneakyThrowspublic String getObjectUrl(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);String url = "";if (flag) {url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).expiry(2, TimeUnit.MINUTES).build());System.out.println(url);}return url;}/*** 删除一个对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称*/@SneakyThrowspublic boolean removeObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());return true;}return false;}/*** 以流的形式获取一个文件对象** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {StatObjectResponse statObject = statObject(bucketName, objectName);if (statObject != null && statObject.size() > 0) {InputStream stream =minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());return stream;}}return null;}/*** 获取对象的元数据** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @return*/@SneakyThrowspublic StatObjectResponse statObject(String bucketName, String objectName) {boolean flag = bucketExists(bucketName);if (flag) {StatObjectResponse stat =minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());return stat;}return null;}/*** 删除指定桶的多个文件对象,返回删除错误的对象列表,全部删除成功,返回空列表** @param bucketName  存储桶名称* @param objectNames 含有要删除的多个object名称的迭代器对象* @return*/@SneakyThrowspublic boolean removeObject(String bucketName, List<String> objectNames) {boolean flag = bucketExists(bucketName);if (flag) {List<DeleteObject> objects = new LinkedList<>();for (int i = 0; i < objectNames.size(); i++) {objects.add(new DeleteObject(objectNames.get(i)));}Iterable<Result<DeleteError>> results =minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build());for (Result<DeleteError> result : results) {DeleteError error = result.get();System.out.println("Error in deleting object " + error.objectName() + "; " + error.message());return false;}}return true;}/*** 以流的形式获取一个文件对象(断点下载)** @param bucketName 存储桶名称* @param objectName 存储桶里的对象名称* @param offset     起始字节的位置* @param length     要读取的长度 (可选,如果无值则代表读到文件结尾)* @return*/@SneakyThrowspublic InputStream getObject(String bucketName, String objectName, long offset, Long length) {boolean flag = bucketExists(bucketName);if (flag) {StatObjectResponse statObject = statObject(bucketName, objectName);if (statObject != null && statObject.size() > 0) {InputStream stream =minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(offset).length(length).build());return stream;}}return null;}/*** 通过InputStream上传对象** @param bucketName  存储桶名称* @param objectName  存储桶里的对象名称* @param inputStream 要上传的流* @param contentType 要上传的文件类型 MimeTypeUtils.IMAGE_JPEG_VALUE* @return*/@SneakyThrowspublic boolean putObject(String bucketName, String objectName, InputStream inputStream, String contentType) {boolean flag = bucketExists(bucketName);if (flag) {minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(inputStream, -1, minioProperties.getFileSize()).contentType(contentType).build());StatObjectResponse statObject = statObject(bucketName, objectName);if (statObject != null && statObject.size() > 0) {return true;}}return false;}
}

4.书写controller控制器接口

@RestController
@Controller
@ResponseBody
@Api(tags = "Minio文件上传")
@RequestMapping("/minio")
public class MinioServlet {@Resourceprivate MinioService minioService;@GetMapping("/list")@ApiOperation("返回桶大全")public R List(){List<String> names = minioService.listBucketName();return R.ok(names);}@PostMapping("/upload")@ApiOperation("上传文件")@ApiImplicitParams({@ApiImplicitParam(name = "multipartFile", value = "文件属性"),@ApiImplicitParam(name = "bucketName", value = "文件要放的桶")})public R upload(MultipartFile multipartFile, String bucketName) throws IOException {// 获取文件类型String fileType = FileTypeUtil.getFileType(multipartFile);// 生成新的文件名称String uuid = UUID.randomUUID().toString().replace("-", "");// 获取文件新名字 uuid+扩展名String fileName = uuid + "." + cn.hutool.core.io.FileTypeUtil.getType(multipartFile.getInputStream());// 上传文件到MINIOString url = minioService.putObject(multipartFile, bucketName, fileName, fileType);return R.ok(url);}@PostMapping("/list")@ApiOperation("根据桶返回里面文件")@ApiImplicitParams(@ApiImplicitParam(name = "buckName",value = "桶名称"))public R list(String buckName){List<String> strings = minioService.listObjectNames(buckName);return R.ok(strings);}
}

让后就可以使用mio了,今天的分享就到这里了