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;
@Bean
public 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 {
@Autowired
private OSSConfig ossConfig;
private Logger log;
@Override
public 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关闭服务,不然会造成OOM
ossClient.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);
}
测试结果