最近買了一個服務器,但沒有買OSS,所以想着自己在服務器建立oss。
MinIO 是一款基於Go語言的高性能對象存儲服務,在Github上已有19K+Star。它采用了Apache License v2.0開源協議,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等。
MinIO安裝
使用docker安裝,docker的安裝就不說了,我之前也有寫。
下載MinIO的Docker鏡像:
docker pull minio/minio
在Docker容器中運行MinIO
docker run -p 9090:9000 --name minio \ -v /mydata/minio/data:/data \ -v /mydata/minio/config:/root/.minio \ -d minio/minio server /data
這里我們將MiniIO的數據和配置文件夾掛在到宿主機上。
訪問 http://192.168.6.132:9090
默認Access Key和Secret都是minioadmin
。
創建一個bucket
修改訪問策略為只讀
需要注意的是,訪問前綴需要設置為*.*
,否則會無法訪問;
然后我們整合到項目中去。
整合使用
引入依賴
<!--MinIO JAVA SDK--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>3.0.10</version> </dependency>
在SpringBoot中開啟文件上傳功能
spring: servlet: multipart: enabled: true #開啟文件上傳 max-file-size: 10MB #限制文件上傳大小為10M
默認是1mb。
一個文件上傳的接口:
@Value("${minio.endpoint}")
private String ENDPOINT;
@Value("${minio.bucketName}")
private String BUCKET_NAME;
@Value("${minio.accessKey}")
private String ACCESS_KEY;
@Value("${minio.secretKey}")
private String SECRET_KEY;
@PreAuthorize("hasAuthority('music:add')") @ApiOperation("添加歌曲") @PostMapping("uploadMusic") public CommonResult uploadMusic(@RequestParam("file") MultipartFile file, @ModelAttribute Music music){ try { // 創建一個MinIO的Java客戶端 MinioClient minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY); boolean isExist = minioClient.bucketExists(BUCKET_NAME); if (isExist) { LOGGER.info("存儲桶已經存在!"); } else { //創建存儲桶並設置只讀權限 minioClient.makeBucket(BUCKET_NAME); minioClient.setBucketPolicy(BUCKET_NAME, "*.*", PolicyType.READ_ONLY); } String fileName = file.getOriginalFilename(); if(fileName == null){ return CommonResult.failed("歌曲名為空"); } SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 設置存儲對象名稱 String objectName = sdf.format(new Date()) + "/" + fileName; minioClient.putObject(BUCKET_NAME, objectName, file.getInputStream(), file.getContentType()); Music music1 = new Music(); music1.setMusicName(music.getMusicName()); music1.setMusicUrl(ENDPOINT + "/" + BUCKET_NAME + "/" + objectName); music1.setSingerName(music.getSingerName()); musicService.insert(music1); LOGGER.info("上傳歌曲路徑:" + ENDPOINT + "/" + BUCKET_NAME + "/" + objectName); } catch (Exception e) { LOGGER.info("上傳發生錯誤: {}!", e.getMessage()); e.printStackTrace(); } return CommonResult.success(null); }