docker安裝minio及實現(xiàn)文件上傳、刪除、下載方式
docker安裝minio及文件上傳、刪除、下載
要搭建一個分布式文件存儲系統(tǒng),聽說fastDFS能實現(xiàn),于是我搜了一下fastDFS,結(jié)果半路殺出一個minio
考慮到拓展性、開發(fā)api文檔完善度、部署效率等原因我選擇了minio。
因為個人沒真正使用過fastDFS,所以不作過多評價,占個坑,以后有機會深度體驗后回來寫評測。
1. docker安裝minio步驟
第一步 查鏡像
docker search minio
第二步 拉鏡像
docker pull minio/minio
第三步 啟動容器
docker run -p 9000:9000 --name minio -d --restart=always -e “MINIO_ACCESS_KEY=admin” -e “MINIO_SECRET_KEY=admin123456” -v /home/data:/data -v /home/config:/root/.minio minio/minio server /data
第四步 登錄界面
- http//:ip+9000
- ACCESS_KEY:damin
- SECRET_KEY:admin123456
2. minio實現(xiàn)文件上傳、刪除、下載
項目結(jié)構(gòu)
pom依賴:
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>3.0.10</version> </dependency> </dependencies>
啟動類:
@SpringBootApplication @EnableDiscoveryClient public class CfUploadApplication { public static void main(String[] args) { SpringApplication.run(CfUploadApplication.class,args); } }
yml配置文件:
server: port: 8002 spring: application: name: upload-service cloud: nacos: discovery: server-addr: localhost:8848 servlet: multipart: enabled: true #開啟文件上傳 max-file-size: 500MB max-request-size: 500MB minio: endpoint: http://localhost:9000 #Minio服務(wù)所在地址 bucketName: cheung #存儲桶名稱 accessKey: admin #訪問的key secretKey: admin123456 #訪問的秘鑰 logging: level: com.heima: debug
controller代碼:
package com.cheung.upload.controller; import io.minio.MinioClient; import io.minio.policy.PolicyType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; @RestController @RequestMapping("file") public class UploadController { private static final Logger LOGGER = LoggerFactory.getLogger(UploadController.class); @Value("${minio.endpoint}") private String ENDPOINT; @Value("${minio.bucketName}") private String BUCKETNAME; @Value("${minio.accessKey}") private String ACCESSKEY; @Value("${minio.secretKey}") private String SECRETKEY; //文件創(chuàng)建 @PostMapping("/upload") public String upload(MultipartFile file) { String s = null; try { MinioClient minioClient = new MinioClient(ENDPOINT, ACCESSKEY, SECRETKEY); //存入bucket不存在則創(chuàng)建,并設(shè)置為只讀 if (!minioClient.bucketExists(BUCKETNAME)) { minioClient.makeBucket(BUCKETNAME); minioClient.setBucketPolicy(BUCKETNAME, "*.*", PolicyType.READ_ONLY); } String filename = file.getOriginalFilename(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 文件存儲的目錄結(jié)構(gòu) String objectName = sdf.format(new Date()) + "/" + filename; // 存儲文件 minioClient.putObject(BUCKETNAME, objectName, file.getInputStream(), file.getContentType()); LOGGER.info("文件上傳成功!"); s = ENDPOINT + "/" + BUCKETNAME + "/" + objectName; } catch (Exception e) { LOGGER.info("上傳發(fā)生錯誤: {}!", e.getMessage()); } return s; } //文件刪除 @DeleteMapping("/delete") public String delete(String name) { try { MinioClient minioClient = new MinioClient(ENDPOINT, ACCESSKEY, SECRETKEY); minioClient.removeObject(BUCKETNAME, name); } catch (Exception e) { return "刪除失敗" + e.getMessage(); } return "刪除成功"; } //文件下載 @GetMapping("/download") public void downloadFiles(@RequestParam("filename") String filename, HttpServletResponse httpResponse) { try { MinioClient minioClient = new MinioClient(ENDPOINT, ACCESSKEY, SECRETKEY); InputStream object = minioClient.getObject(BUCKETNAME, filename); byte buf[] = new byte[1024]; int length = 0; httpResponse.reset(); httpResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); httpResponse.setContentType("application/octet-stream"); httpResponse.setCharacterEncoding("utf-8"); OutputStream outputStream = httpResponse.getOutputStream(); while ((length = object.read(buf)) > 0) { outputStream.write(buf, 0, length); } outputStream.close(); } catch (Exception ex) { LOGGER.info("導(dǎo)出失敗:", ex.getMessage()); } } }
上傳文件
使用postman進行測試
刪除文件
下載文件
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Windows系統(tǒng)下安裝docker窗口的配置過程
相信大家都知道Docker有很多種安裝的選擇,其中支持最好的是Ubuntu系統(tǒng)。而且docker如果想在windows上運行必須借助docker-machine,這篇文章將給大家詳細的介紹在Windows系統(tǒng)上安裝docker窗口的配置過程,有需要的朋友們可以參考借鑒。2016-10-10Docker數(shù)據(jù)卷掛載命令volume(-v)與mount的使用總結(jié)
本文主要介紹了Docker數(shù)據(jù)卷掛載命令volume(-v)與mount的使用總結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08docker logs-查看docker容器日志的實現(xiàn)
這篇文章主要介紹了docker logs-查看docker容器日志的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03淺談Docker run 容器處于created狀態(tài)問題
這篇文章主要介紹了解決Docker run 容器處于created狀態(tài)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Docker swarm如何通過docker-compose部署應(yīng)用
這篇文章主要介紹了Docker swarm如何通過docker-compose部署應(yīng)用問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02