MINIO 安装以及部署
官网:MinIO | Code and downloads to create high performance object storage
下载后是一个minio.exe的文件,可以先创一个文件夹来存放数据以及文件
在文件的目录下cmd进入控制台
minio.exe server data
启动成功后控制台会打印账号密码
访问地址:http://127.0.0.1:9000,输入账号密码登录页面
创建桶
解读一下:
bucket name:bucket名字。
versioning: 版本控制允许在同一个键下保留同一个对象的多个版本。
object locking:对象锁定防止对象被删除。需要支持保留和合法持有。只能在创建桶时启用。
quota:配额用于限制桶内的数据量。
retention:保留是指在一段时间内防止对象删除的规则。为了设置桶保留策略,必须启用版本控制。
文件上传测试
Spring使用minio
在官网下找到最新的依赖包
添加依赖后,在yml文件下配置相关配置
添加minio的配置文件,注意:@Value的注解导入是spring的原生注解
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Value("${minio.bucket-name}")private String bucketName;@Beanpublic MinioClient minioClient(){return MinioClient.builder().endpoint(endpoint).credentials(accessKey,secretKey).build();}
}
创建工具类,实现文件上传
/*** 上传文件到指定的存储桶中** @param bucketName 存储桶名称* @param file 上传的文件* @param objectName 存储对象的名称* @param contentType 文件的内容类型* @return 文件上传的响应对象* @throws Exception 如果上传过程中发生异常*/@SneakyThrows(Exception.class)public ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, String objectName, String contentType) {InputStream inputStream = file.getInputStream();return minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).contentType(contentType).stream(inputStream, inputStream.available(), -1).build());}
controller层实现接口调用
@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) {try {System.out.println(123);//文件名String fileName = file.getOriginalFilename();String newFileName = System.currentTimeMillis() + "." + StringUtils.substringAfterLast(fileName, ".");//类型String contentType = file.getContentType();minioTemplate.uploadFile(minioConfig.getBucketName(), file, newFileName, contentType);return "上传成功";} catch (Exception e) {e.printStackTrace();log.error("上传失败");return "上传失败";}}
postman测试结果
Spring实现阿里云OSS文件上传
创建Bucket时需要记录Endpoint访问节点
再在管理创建用户拿到对应的ID以及Secret
在yml文件中配置相对应的配置
创建OSS配置文件以及工具类
@Service
public class FileServiceImpl implements FileService {@Autowiredprivate OSSConfig ossConfig;private Logger log;@Overridepublic String upload(MultipartFile file) {//获取相关配置String bucketName = ossConfig.getBucketName();String endPoint = ossConfig.getEndPoint();String accessKeyId = ossConfig.getAccessKeyId();String accessKeySecret = ossConfig.getAccessKeySecret();//创建OSS对象OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);//获取原生文件名String originalFilename = file.getOriginalFilename();//JDK8的日期格式LocalDateTime time = LocalDateTime.now();DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd");//拼装OSS上存储的路径String folder = dft.format(time);String fileName = generateUUID();String extension = originalFilename.substring(originalFilename.lastIndexOf("."));//在OSS上bucket下的文件名String uploadFileName = "user/" + folder + "/" + fileName + extension;try {PutObjectResult result = ossClient.putObject(bucketName, uploadFileName, file.getInputStream());//拼装返回路径if (result != null) {return "https://"+bucketName+"."+endPoint+"/"+uploadFileName;}} catch (IOException e) {log.error("文件上传失败:{}",e.getMessage());} finally {//OSS关闭服务,不然会造成OOMossClient.shutdown();}return null;}/*** 获取随机字符串* @return*/private String generateUUID() {return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);}
}
OSSconfig
@ConfigurationProperties(prefix = "aliyun.oss")
@Configuration
@Data
public class OSSConfig {private String endPoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}
Controller层进行测试
@PostMapping("/upload")public Map<String , Object> uploadFile(@RequestPart("file") MultipartFile file) {String FileStr = fileService.upload(file);return buildResult(FileStr);}
测试结果