上一篇主要講述了在linux系統中搭建一個minio文件服務器,那么這一篇則用來整合java代碼中使用,我之前自己已經搭建好了一個springboot項目,那么這一篇將詳細講述如何把minio整合進springboot中,特此說明,本篇只會貼出關於minio的關鍵代碼,至於如何搭建springboot請個人百度或者參考本人即將會寫的博客,項目完整代碼請到GitHub:https://github.com/Slience-zae/mail-demo.git。廢話不多說,上操作步驟。
一、添加配置信息至配置文件
pom文件依賴:文件服務器 + 流操作依賴
<!--minio文件服務器-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>6.0.11</version>
</dependency>
<!--commons-io 流操作 (可選)-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
yum文件依賴:minio文件服務器的訪問地址以及使用密鑰(登錄訪問時會驗證)
# minio 文件存儲配置信息 minio: endpoint: http://192.168.159.129:9000 accesskey: minioadmin secretKey: minioadmin
propertise文件依賴:存儲桶的名稱(直接在代碼寫也能完成,但是為了靈活配置,所以最好將這種信息寫在配置文件里面,通過注解方式讀取注入到使用的字段中)
#存儲桶的key Bucket.Name=product
二、代碼配置
1.創建實體類MinioProp,用於屬性封裝,將yum文件中的訪問路徑,密鑰等信息封裝進該實體類中。
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * minio 屬性值 */ @Data @Component @ConfigurationProperties(prefix = "minio") public class MinioProp { /** * 連接url */ private String endpoint; /** * 用戶名 */ private String accesskey; /** * 密碼 */ private String secretKey; }
2.編寫minio的核心配置類,提供生成MinioClient對象的方法
import com.maven.maildemo.config.vo.MinioProp; import io.minio.MinioClient; import io.minio.errors.InvalidEndpointException; import io.minio.errors.InvalidPortException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * minio 核心配置類 */ @Configuration @EnableConfigurationProperties(MinioProp.class) public class MinioConfiguration { @Autowired private MinioProp minioProp; /** * 獲取 MinioClient * * @return * @throws InvalidPortException * @throws InvalidEndpointException */ @Bean public MinioClient minioClient() throws InvalidPortException, InvalidEndpointException { return new MinioClient(minioProp.getEndpoint(), minioProp.getAccesskey(), minioProp.getSecretKey()); } }
三、上傳、下載方法的實現
import io.minio.MinioClient; import io.minio.ObjectStat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.apache.commons.io.IOUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * minio文件管理,上傳,下載文件 */ @RestController @RequestMapping("/minio") public class MinioController { @Autowired private MinioClient minioClient; @Value("${Bucket.Name}") private String bucketName; /** * 從minio服務器下載文件 * @param request * @param response * @param fileName */ @PostMapping("/download") private void download(HttpServletRequest request, HttpServletResponse response,String fileName){ InputStream in = null; //獲取文件對象 start原信息 try { ObjectStat stat = minioClient.statObject(bucketName,fileName); response.setContentType(stat.contentType()); //response.setContentType("application/octet-stream;charset=UTF-8"); in = minioClient.getObject(bucketName,fileName); IOUtils.copy(in,response.getOutputStream()); } catch (Exception e) { e.printStackTrace(); }finally { if(in!=null){ try { //關閉流操作 in.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 上傳文件 * @param file * @param request * @return */ @PostMapping("/upload") public String upload(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request){ if(file == null || file.getSize() == 0){ return "上傳文件不能為空"; } //獲取文件的真實名稱 String orgfileName = file.getOriginalFilename(); try { //獲取文件的輸入流信息 InputStream in = file.getInputStream(); //得到內容的類型 String contententType = file.getContentType(); //上傳到文件服務器:桶key,文件名,文件的io信息 minioClient.putObject(bucketName,orgfileName,in,null,null,null,contententType); //封裝了文件桶名,文件名等信息.如果前端需要則封裝進實體返回給前端,不需要則不用寫 Map<String,Object> data = new HashMap<>(); data.put("bucketName",bucketName); data.put("fileName",orgfileName); } catch (Exception e) { e.printStackTrace(); } return "上傳成功"; } }
需要明白的一點是,minio文件服務器是先創建的存儲桶,然后文件是放在存儲桶中的,一般來言,我們上傳文件到存儲桶時會按照一定的格式從新生成一個包含原文件名的文件名稱,防止新傳入的文件的文件名稱與服務器上的文件名稱沖突,導致上傳失敗,我這里只是為了給大家呢演示一下功能,因此不再進行重新生成文件名稱,而是直接使用的文件的真實名稱。另外,本次搭建也是參考了網上的一篇博客:http://www.tingcream.com/blogArticle/detail/2a396ff149f249de983bb6fae6c4c3a9。本人實際操作搭建成功后才加上了自己的一些改動才寫的本篇博客,對以上的一個搭建代碼存在疑問,那就是下載文件的代碼中finally后面有一個關閉流的操作,但是spring框架應該會默認關閉流的,不需要人為的進行操作,因此我認為finally后的代碼完全可以省略。
如有問題,歡迎評論留言。
