是什么
MinIO 是一個(gè)高性能的分布式對(duì)象存儲(chǔ)服務(wù),適合存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù),如圖片,音頻,視頻,日志等。對(duì)象文件最大可以達(dá)到5TB。
安裝啟動(dòng)
mkdir -p /usr/local/minio
cd /usr/local/minio
# 下載安裝包
wget https://dl.min.io/server/minio/release/linux-amd64/minio
下載完畢后:
在當(dāng)前minio目錄下,會(huì)出現(xiàn)一個(gè)minio文件
# 給予權(quán)限
chmod +x minio
# 創(chuàng)建minio文件存儲(chǔ)目錄及日志目錄
mkdir -p /usr/local/minio/data
mkdir -p /usr/local/minio/logs
然后在 /usr/local/minio/目錄下,新建一個(gè)run.sh并編輯以下內(nèi)容
vim run.sh,然后將以下內(nèi)容保存到run.sh,并為其賦予執(zhí)行權(quán)限chmod u+x run.sh
run.sh內(nèi)容如下:
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123456
# nohup啟動(dòng)服務(wù) 指定文件存放路徑 /root/data 還有設(shè)置日志文件路徑 /root/minio/log
nohup ./minio server --address :9000 --console-address :9001 /usr/local/minio/data > /usr/local/minio/logs/minio.log 2>&1 &
啟動(dòng)minIO
# 啟動(dòng)minio服務(wù)
./run.sh
# 查看日志
tail -f /usr/local/minio/logs/minio.log
平臺(tái)使用
地址:http://127.0.0.1:9000(注意開(kāi)放對(duì)應(yīng)端口9000、9001)【當(dāng)端口 9000
用于連接到 API 時(shí),MinIO 會(huì)自動(dòng)將瀏覽器訪問(wèn)重定向到 MinIO 控制臺(tái)9001?!?/p>
輸入賬號(hào)密碼后,
創(chuàng)建bucket,名字隨意,創(chuàng)建完成后服務(wù)器/usr/local/minio/data下也會(huì)創(chuàng)建這個(gè)文件目錄
http://www.dedeyun.com/it/java/102599.html
SpringBoot集成MinIO
1.添加依賴
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.1</version>
</dependency>
2.配置文件
spring:
minio:
endpoint: http://124.222.253.33:9000
access-key: minio
secret-key: minio123456
bucket-name: file
servlet:
multipart: # 上傳文件最大大小
max-file-size: 1024MB
max-request-size: 1024MB
3.配置類創(chuàng)建客戶端
@Data
@Component
@ConfigurationProperties(prefix = "spring.minio")
public class MinioConfig {
private String endpoint;
private String accessKey;
private String secretKey;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
4.核心業(yè)務(wù)類
僅有一些基礎(chǔ)操作文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-656335.html
@Slf4j
@Service
public class FileService {
@Autowired
private MinioClient minioClient;
private static final String SEPARATOR = "/";
@Value("${spring.minio.bucket-name}")
private String bucketName;
/**
* 上傳文件
*
* @param file 文件對(duì)象
* @param id 設(shè)備ID
*/
public void uploadFile(MultipartFile file, Long id) {
try {
// 創(chuàng)建bucket
if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
// 同名文件會(huì)進(jìn)行覆蓋
String objectName = file.getOriginalFilename();
@Cleanup
InputStream inputStream = file.getInputStream();
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(id + SEPARATOR + objectName) // 多文件夾
.stream(inputStream, file.getSize(), -1)
.contentType(file.getContentType())
.build());
} catch (Exception e) {
log.error("文件上傳失?。}", e.getMessage());
throw new RuntimeException("文件上傳失敗,請(qǐng)重新上傳");
}
}
/**
* 刪除文件
*
* @param path 文件路徑
*/
public void removeObject(String path) {
try {
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(bucketName)
.object(path)
.build());
} catch (Exception e) {
log.error("文件刪除失?。}", e.getMessage());
throw new RuntimeException("文件刪除失敗,請(qǐng)重新刪除");
}
}
/**
* 文件列表
*
* @param id 設(shè)備ID
*/
public List<FileInfo> listFiles(Long id) {
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).recursive(true).build());
List<FileInfo> infos = new ArrayList<>();
results.forEach(r -> {
FileInfo info = new FileInfo();
try {
Item item = r.get();
// 最多一層文件夾
String path = item.objectName();
int idx = path.indexOf(SEPARATOR);
if (path.substring(0, idx).equals(id.toString())) {
info.setPath(path);
info.setFileName(path.substring(idx + 1));
info.setSize(item.size());
infos.add(info);
}
} catch (Exception e) {
e.printStackTrace();
}
});
return infos;
}
/**
* 下載文件
*
* @param response response
* @param path 文件路徑
*/
public void downFile(HttpServletResponse response, String path) {
try {
@Cleanup
OutputStream outputStream = response.getOutputStream();
@Cleanup
InputStream inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(this.bucketName)
.object(path).build());
response.reset();
String fileName = path.substring(path.indexOf(SEPARATOR) + 1);
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode(fileName.substring(fileName.lastIndexOf(SEPARATOR) + 1), "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
FileCopyUtils.copy(inputStream, outputStream);
} catch (Throwable e) {
log.error("文件下載失敗!{}", e.getMessage());
throw new RuntimeException("文件下載失敗,請(qǐng)重新下載");
}
}
}
controller文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-656335.html
@RestController
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file, Long id) {
fileService.uploadFile(file, id);
return "上傳成功";
}
@GetMapping("/download")
public String downloadFile(HttpServletResponse response, String path) {
fileService.downFile(response, path);
return "下載成功";
}
@DeleteMapping("/delete")
public String deleteFile(String path) {
fileService.removeObject(path);
return "刪除成功";
}
@GetMapping("/list")
public List<FileInfo> listFiles(Long id) {
return fileService.listFiles(id);
}
}
到了這里,關(guān)于對(duì)象存儲(chǔ)服務(wù)-MinIO基本集成的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!