目录
minio桶权限配置
minioDemo
添加依赖:
minio的yml配置及配置类
简易工具类
testdemo
首先创建一个用户,然后创建一个组,创建的时候就可以把这个用户添加到组中,然后选中组分配读写权限就OK了
紧接着写一个springboot的Demo熟悉一下minio使用
io.minio
minio
8.5.2
#minio配置
minio:
endpoint: http://127.0.0.1:9005/
#minio用户名
accessKey: admin
#minio密码
secretKey: 12345678
#桶
bucketName: public
#默认 10分钟,单位为秒
preview-expires: 600
@Configuration
@Component
@ConfigurationProperties(prefix = "spring.minio")
@Setter
@Getter
public class MinioConfig {
private static final Logger log = LoggerFactory.getLogger(MinioConfig.class);
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
private String publicBucketName = "public";
private int previewExpires = 3600;
@Bean
public MinioClient getMinioClient() {
log.info("开始===初始化minioClient");
//初始化minioClient
MinioClient minioClient = MinioClient.builder().endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
return minioClient;
}
}
这里如果有以下警告,大致意思是未配置springboot配置注释处理器
Spring Boot Configuration Annotation Processor not configured
请添加依赖
org.springframework.boot
spring-boot-configuration-processor
true
@Component
public class MinioClientUtils {
private static final Logger log = LoggerFactory.getLogger(MinioClientUtils.class);
private MinioClient minioClient;
public MinioClientUtils(MinioClient minioClient) {
this.minioClient = minioClient;
}
/**
* 文件上传
* @param file 文件
* @param bucketName 桶
* @return
*/
public Map uploadFile(MultipartFile file, String bucketName) {
String filename = FileUtils.extractUploadFilename(file);
try {
InputStream inputStream = file.getInputStream();
// 上传到minio服务器
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(filename)
.stream(inputStream, -1L, 10485760L)
.build());
} catch (Exception e) {
e.printStackTrace();
}
// 返回地址
Map resultMap = new HashMap<>();
resultMap.put("url", filename);
return resultMap;
}
/**
* 文件下载
* @param fileName 文件名称
* @param response HttpServletResponse
* @param bucketName 桶名称
*/
public void downloadFile(@NotNull String fileName,
@NotNull String originalName,
HttpServletResponse response,
@NotNull String bucketName) {
InputStream inputStream = null;
ServletOutputStream outputStream = null;
try {
// 获取文件对象
inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
int length = 0;
response.reset();
byte[] buf = new byte[1024000];
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(originalName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
outputStream = response.getOutputStream();
// 输出文件
while ((length = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, length);
}
inputStream.close();
outputStream.flush();
} catch (Throwable ex) {
response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "文件下载失败";
try {
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
} finally {
try {
outputStream.close();
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 删除文件
* @param fileName 文件名
* @param bucketName 桶名称
*/
public void delFile(String fileName,
String bucketName) throws Exception{
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
}
}
public class FileUtils {
/**
* 设置上传的文件名
* 规则 文件名+时间戳+后缀
* @param file 文件
* @return
*/
public static final String extractUploadFilename(MultipartFile file) {
String fileName = file.getOriginalFilename();
String[] fileArray = fileName.split("\\.");
fileName = fileArray[0]+System.currentTimeMillis()+"."+fileArray[1];
return fileName;
}
}
上传测试:
@SpringBootTest
@Slf4j
@RunWith(SpringRunner.class)
public class MinioFileTest {
@Resource
private MinioClientUtils minioClientUtils;
@Test
public void uploadFile() throws Exception {
File file = new File("D:\\学习\\high.txt");
FileInputStream fileInputStream = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("copy" + file.getName(), file.getName(), "application/octet-stream", fileInputStream);
minioClientUtils.uploadFile(multipartFile,"public");
}
@Test
public void deleteFile() throws Exception {
minioClientUtils.delFile("high1685522002778.txt","public");
}
}
下载测试
@Slf4j
@RestController
@RequestMapping("/minio-test")
public class MinioController {
private final MinioClientUtils minioClientUtils;
@Autowired
public MinioController(MinioClientUtils minioClientUtils) {
this.minioClientUtils = minioClientUtils;
}
/**
* 单文件下载
* fileName 文件名
*/
@GetMapping("/download")
public void download(HttpServletResponse response) throws Exception{
String fileName = "high1685527608201.txt";
String originalName = "high.txt";
minioClientUtils.downloadFile(fileName,originalName,response,"public");
}
}
postman测试下载注意使用这个按钮