是什么
MinIO 是一個高性能的分布式對象存儲服務,適合存儲非結構化數據,如圖片,音頻,視頻,日志等。對象文件最大可以達到5TB。
安裝啟動
mkdir -p /usr/local/minio
cd /usr/local/minio# 下載安裝包
wget https://dl.min.io/server/minio/release/linux-amd64/minio
下載完畢后:
在當前minio目錄下,會出現一個minio文件
# 給予權限
chmod +x minio# 創建minio文件存儲目錄及日志目錄
mkdir -p /usr/local/minio/data
mkdir -p /usr/local/minio/logs
然后在 /usr/local/minio/目錄下,新建一個run.sh并編輯以下內容
vim run.sh,然后將以下內容保存到run.sh,并為其賦予執行權限chmod u+x run.sh
run.sh內容如下:
#!/bin/bash
export MINIO_ACCESS_KEY=minio
export MINIO_SECRET_KEY=minio123456
# nohup啟動服務 指定文件存放路徑 /root/data 還有設置日志文件路徑 /root/minio/log
nohup ./minio server --address :9000 --console-address :9001 /usr/local/minio/data > /usr/local/minio/logs/minio.log 2>&1 &
啟動minIO
# 啟動minio服務
./run.sh
# 查看日志
tail -f /usr/local/minio/logs/minio.log
平臺使用
地址:http://127.0.0.1:9000(注意開放對應端口9000、9001)【當端口 9000
用于連接到 API 時,MinIO 會自動將瀏覽器訪問重定向到 MinIO 控制臺9001。】
輸入賬號密碼后,
創建bucket,名字隨意,創建完成后服務器/usr/local/minio/data下也會創建這個文件目錄
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:9000access-key: miniosecret-key: minio123456bucket-name: fileservlet:multipart: # 上傳文件最大大小max-file-size: 1024MBmax-request-size: 1024MB
3.配置類創建客戶端
@Data
@Component
@ConfigurationProperties(prefix = "spring.minio")
public class MinioConfig {private String endpoint;private String accessKey;private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}
4.核心業務類
僅有一些基礎操作
@Slf4j
@Service
public class FileService {@Autowiredprivate MinioClient minioClient;private static final String SEPARATOR = "/";@Value("${spring.minio.bucket-name}")private String bucketName;/*** 上傳文件** @param file 文件對象* @param id 設備ID*/public void uploadFile(MultipartFile file, Long id) {try {// 創建bucketif (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}// 同名文件會進行覆蓋String objectName = file.getOriginalFilename();@CleanupInputStream 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("文件上傳失敗,請重新上傳");}}/*** 刪除文件** @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("文件刪除失敗,請重新刪除");}}/*** 文件列表** @param id 設備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 {@CleanupOutputStream outputStream = response.getOutputStream();@CleanupInputStream 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("文件下載失敗,請重新下載");}}
}
controller
@RestController
public class FileController {@Autowiredprivate 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);}
}