SpringBoot 整合 Minio 實現文件切片極速上傳技術

Centos7安裝Minio

創建目標文件夾

mkdir?minio

圖片

使用docker查看目標鏡像狀況

大家需要注意,此處我們首先需要安裝docker,對于相關安裝教程,大家可以查看我之前的文章,按部就班就可以,此處不再贅述!!!

docker?search?minio

圖片

使用docker拉去鏡像

docker?pull?minio/minio

圖片

查看鏡像是否拉取成功

docker?images

圖片

啟動Minio容器

docker?run?-p?9000:9000?-p?9090:9090??????--net=host??????--name?minio??????-d?--restart=always??????-e?"MINIO_ACCESS_KEY=IT@WangHui"??????-e?"MINIO_SECRET_KEY=IT@WangHui"????????????minio/minio?server??????/data?--console-address?":9000"?-address?":9090"

圖片

注意一下,對于密碼強度是有要求的,不然報錯

圖片

這是一個運行 MinIO 容器的 Docker 命令,具體參數解釋如下:

  • -p:?映射容器內部的端口到宿主機上。其中 9000 和 9090 分別映射到宿主機的 9000 和 9090 端口上。

  • --net=host:?將容器加入到主機網絡中,共享宿主機的 IP 地址。

  • --name minio:?指定容器的名稱為 minio。

  • --restart=always:?設置容器在退出后自動重新啟動。

  • -e:?設置環境變量。這里設置了兩個環境變量:MINIO_ACCESS_KEY?和?MINIO_SECRET_KEY,值分別為?IT@WangHui?和?IT@WangHui

  • --mount:?將容器內部的目錄掛載到宿主機上。這里將容器內的?/data?目錄掛載到了宿主機的?/data?目錄上。

  • --console-address:?指定容器的控制臺地址。這里設置為 :9000,表示可以通過宿主機上的 9000 端口訪問容器的控制臺。

  • -address:?指定容器的網絡地址。這里設置為 :9090,表示可以通過宿主機上的 9090 端口訪問容器的服務。

提示:頁面訪問9000,代碼里面9090

提示:頁面訪問9000,代碼里面9090

提示:頁面訪問9000,代碼里面9090

報錯警告

圖片

原因:

主要是因為在啟動docker容器的時候或做docker配置的時候,還對防火墻設置重新啟動等配置,這樣會清除docker的相關配置,導致在查詢防火墻規則的時候顯示不到docker的鏈。iptables -L查詢iptables鏈。

解決:

是由于firewalld重啟導致,而docker重啟又會將其注冊iptables鏈找回來。

然后刪除剛才啟動失敗的容器,不然會繼續報錯容器已存在

systemctl?restart?docker?#重啟docker
docker?ps?-a?#查看運行容器
docker?rm?-f?minio?#根據容器名刪除容器(自己注意辨別自己的)

圖片

當啟動后在瀏覽器訪問http://localhost:9000就可以訪問minio的圖形化界面了,如圖所示:

圖片

用戶名密碼就是啟動參數里面的數據

如果訪問失敗,那就是防火墻問題或者是啟動參數最后兩項沒有添加,再不會有其他的,除非容器沒有啟動成功

查看放行端口可以使用如下命令

?firewall-cmd?--list-ports

要放行CentOS 7上的9000端口和9090端口,您可以按照以下步驟操作:

1.檢查防火墻狀態

使用以下命令檢查防火墻狀態:

systemctl?status?firewalld

如果防火墻已停止,則啟動它:

systemctl?start?firewalld
2.允許9000端口通過防火墻

使用以下命令允許TCP流量通過9000端口:

firewall-cmd?--zone=public?--add-port=9000/tcp?--permanent
firewall-cmd?--zone=public?--add-port=9090/tcp?--permanent

這將向防火墻添加一個規則,以允許TCP流量通過9000端口。要永久保存此更改,請運行以下命令:

firewall-cmd?--reload
3.重新啟動防火墻服務shell

使用以下命令重新啟動防火墻服務:

systemctl?restart?firewalld

現在,您已經成功地放行了CentOS 7上的9000和9090端口。

?搭建springboot 環境

代碼結構

圖片

引入項目依賴

<!--?操作minio的java客戶端-->
<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.2</version>
</dependency>
<!--?操作minio的java客戶端--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.1</version>
</dependency>
<!--????????jwt鑒權相應依賴-->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.2</version>
</dependency>

創建容器桶

圖片

圖片

獲取API訪問憑證

圖片

圖片

編寫配置文件

server:port:?8080
spring:servlet:multipart:max-file-size:?10MBmax-request-size:?10MB#minio配置minio:access-key:?dAMaxkWaXUD1CV1JHbqwsecret-key:?AXt3SD0JFkDENFbMeJKOOQb5wj8KvabZWu33Rs84url:?http://192.168.18.14:9090??#訪問地址bucket-name:?wanghui

首先是服務器的配置:

  • 端口號為8080,用于監聽請求。

  • 使用了一個Servlet來處理multipart/form-data類型的請求。

  • 在接收到multipart/form-data類型的請求時,會將上傳的文件大小限制在10MB以內,并將請求大小限制在10MB以內。

接下來是minio的配置:

  • access-keysecret-key是訪問minio服務的憑證,需要根據實際情況進行填寫。

  • url是minio服務的地址,需要根據實際情況進行填寫。

  • bucket-name是存儲文件的桶名,需要根據實際情況進行填寫。

http請求狀態

package?com.xiaohui.utils;/***?@Description?http請求狀態*?@Author?IT小輝同學*?@Date?2023/06/01*/
public?class?HttpStatus
{/***?操作成功*/public?static?final?int?SUCCESS?=?200;/***?對象創建成功*/public?static?final?int?CREATED?=?201;/***?請求已經被接受*/public?static?final?int?ACCEPTED?=?202;/***?操作已經執行成功,但是沒有返回數據*/public?static?final?int?NO_CONTENT?=?204;/***?資源已被移除*/public?static?final?int?MOVED_PERM?=?301;/***?重定向*/public?static?final?int?SEE_OTHER?=?303;/***?資源沒有被修改*/public?static?final?int?NOT_MODIFIED?=?304;/***?參數列表錯誤(缺少,格式不匹配)*/public?static?final?int?BAD_REQUEST?=?400;/***?未授權*/public?static?final?int?UNAUTHORIZED?=?401;/***?訪問受限,授權過期*/public?static?final?int?FORBIDDEN?=?403;/***?資源,服務未找到*/public?static?final?int?NOT_FOUND?=?404;/***?不允許的http方法*/public?static?final?int?BAD_METHOD?=?405;/***?資源沖突,或者資源被鎖*/public?static?final?int?CONFLICT?=?409;/***?不支持的數據,媒體類型*/public?static?final?int?UNSUPPORTED_TYPE?=?415;/***?系統內部錯誤*/public?static?final?int?ERROR?=?500;/***?接口未實現*/public?static?final?int?NOT_IMPLEMENTED?=?501;/***?系統警告消息*/public?static?final?int?WARN?=?601;
}

通用常量信息

package?com.xiaohui.utils;import?io.jsonwebtoken.Claims;/***?@Description?通用常量信息*?@Author?IT小輝同學*?@Date?2023/06/01*/
public?class?Constants
{/***?UTF-8?字符集*/public?static?final?String?UTF8?=?"UTF-8";/***?GBK?字符集*/public?static?final?String?GBK?=?"GBK";/***?www主域*/public?static?final?String?WWW?=?"www.";/***?http請求*/public?static?final?String?HTTP?=?"http://";/***?https請求*/public?static?final?String?HTTPS?=?"https://";/***?通用成功標識*/public?static?final?String?SUCCESS?=?"0";/***?通用失敗標識*/public?static?final?String?FAIL?=?"1";/***?登錄成功*/public?static?final?String?LOGIN_SUCCESS?=?"Success";/***?注銷*/public?static?final?String?LOGOUT?=?"Logout";/***?注冊*/public?static?final?String?REGISTER?=?"Register";/***?登錄失敗*/public?static?final?String?LOGIN_FAIL?=?"Error";/***?驗證碼有效期(分鐘)*/public?static?final?Integer?CAPTCHA_EXPIRATION?=?2;/***?令牌*/public?static?final?String?TOKEN?=?"token";/***?令牌前綴*/public?static?final?String?TOKEN_PREFIX?=?"Bearer?";/***?令牌前綴*/public?static?final?String?LOGIN_USER_KEY?=?"login_user_key";/***?用戶ID*/public?static?final?String?JWT_USERID?=?"userid";/***?用戶名稱*/public?static?final?String?JWT_USERNAME?=?Claims.SUBJECT;/***?用戶頭像*/public?static?final?String?JWT_AVATAR?=?"avatar";/***?創建時間*/public?static?final?String?JWT_CREATED?=?"created";/***?用戶權限*/public?static?final?String?JWT_AUTHORITIES?=?"authorities";/***?資源映射路徑?前綴*/public?static?final?String?RESOURCE_PREFIX?=?"/profile";/***?RMI?遠程方法調用*/public?static?final?String?LOOKUP_RMI?=?"rmi:";/***?LDAP?遠程方法調用*/public?static?final?String?LOOKUP_LDAP?=?"ldap:";/***?LDAPS?遠程方法調用*/public?static?final?String?LOOKUP_LDAPS?=?"ldaps:";/***?定時任務白名單配置(僅允許訪問的包名,如其他需要可以自行添加)*/public?static?final?String[]?JOB_WHITELIST_STR?=?{?"com.ruoyi"?};/***?定時任務違規的字符*/public?static?final?String[]?JOB_ERROR_STR?=?{?"java.net.URL",?"javax.naming.InitialContext",?"org.yaml.snakeyaml","org.springframework",?"org.apache",?"com.ruoyi.common.utils.file",?"com.ruoyi.common.config"?};
}

創建Minio的配置類

package?com.xiaohui.config;import?io.minio.MinioClient;
import?lombok.Data;
import?org.springframework.boot.context.properties.ConfigurationProperties;
import?org.springframework.context.annotation.Bean;
import?org.springframework.context.annotation.Configuration;/***?@Description?minio配置*?@Author?IT小輝同學*?@Date?2023/06/02*/
@Data
@Configuration
@ConfigurationProperties(prefix?=?"spring.minio")
public?class?MinioConfig?{private?String?accessKey;private?String?secretKey;private?String?url;private?String?bucketName;@Beanpublic?MinioClient?minioClient(){return?MinioClient.builder().endpoint(url).credentials(accessKey,secretKey).build();}
}

這段代碼是Java中的一個配置類,用于配置與MinIO(一個對象存儲服務)相關的屬性。具體來說:

  • @Configuration注解表示這是一個配置類,用于將該類中定義的屬性注入到其他組件中使用。

  • @ConfigurationProperties注解表示該類使用了spring.minio.*前綴的屬性來配置Minio相關的屬性。

  • @Data注解表示自動生成getter和setter方法,簡化了代碼編寫。

  • accessKeysecretKey屬性分別表示訪問密鑰和密鑰值,用于連接到MinIO服務。

  • url屬性表示MinIO服務的URL地址。

  • bucketName屬性表示存儲桶名稱。

  • @Bean注解表示將minioClient()方法返回的對象注冊為bean,以便在其他組件中使用。

  • minioClient()方法返回了一個MinioClient對象,用于連接到MinIO服務并操作存儲桶。其中,endpoint()方法用于設置MinIO服務的URL地址,credentials()方法用于設置訪問密鑰和密鑰值。

創建Minio的工具類

package?com.xiaohui.utils;import?com.xiaohui.config.MinioConfig;
import?io.minio.*;
import?io.minio.errors.*;
import?io.minio.http.Method;
import?lombok.SneakyThrows;
import?org.apache.tomcat.util.http.fileupload.IOUtils;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.http.HttpHeaders;
import?org.springframework.http.MediaType;
import?org.springframework.http.ResponseEntity;
import?org.springframework.stereotype.Component;
import?org.springframework.web.multipart.MultipartFile;import?java.io.ByteArrayOutputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.UnsupportedEncodingException;
import?java.net.URLEncoder;
import?java.security.InvalidKeyException;
import?java.security.NoSuchAlgorithmException;
import?java.time.ZonedDateTime;
import?java.util.Arrays;
import?java.util.HashMap;
import?java.util.Map;
import?java.util.concurrent.TimeUnit;/***?@Description?Minio工具類*?@Author?IT小輝同學*?@Date?2023/06/02*/@Component
public?class?MinioUtils?{@Autowiredprivate?MinioClient?minioClient;@Autowiredprivate?MinioConfig?configuration;/***?@param?name?名字*?@return?boolean*?@Description?description:?判斷bucket是否存在,不存在則創建*?@Author?IT小輝同學*?@Date?2023/06/02*/public?boolean?existBucket(String?name)?{boolean?exists;try?{exists?=?minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());if?(!exists)?{minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());exists?=?true;}}?catch?(Exception?e)?{e.printStackTrace();exists?=?false;}return?exists;}/***?@param?bucketName?存儲bucket名稱*?@return?{@link?Boolean?}*?@Description?創建存儲bucket*?@Author?IT小輝同學*?@Date?2023/06/02*/public?Boolean?makeBucket(String?bucketName)?{try?{minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}?catch?(Exception?e)?{e.printStackTrace();return?false;}return?true;}/***?@param?bucketName?存儲bucket名稱*?@return?{@link?Boolean?}*?@Description?刪除存儲bucket*?@Author?IT小輝同學*?@Date?2023/06/02*/public?Boolean?removeBucket(String?bucketName)?{try?{minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());}?catch?(Exception?e)?{e.printStackTrace();return?false;}return?true;}/***?@param?fileName?文件名稱*?@param?time?????時間*?@return?{@link?Map?}*?@Description?獲取上傳臨時簽名*?@Author?IT小輝同學*?@Date?2023/06/02*/@SneakyThrowspublic?Map?getPolicy(String?fileName,?ZonedDateTime?time)?{PostPolicy?postPolicy?=?new?PostPolicy(configuration.getBucketName(),?time);postPolicy.addEqualsCondition("key",?fileName);try?{Map<String,?String>?map?=?minioClient.getPresignedPostFormData(postPolicy);HashMap<String,?String>?map1?=?new?HashMap<>();map.forEach((k,?v)?->?{map1.put(k.replaceAll("-",?""),?v);});map1.put("host",?configuration.getUrl()?+?"/"?+?configuration.getBucketName());return?map1;}?catch?(ErrorResponseException?e)?{e.printStackTrace();}?catch?(InsufficientDataException?e)?{e.printStackTrace();}?catch?(InternalException?e)?{e.printStackTrace();}?catch?(InvalidKeyException?e)?{e.printStackTrace();}?catch?(InvalidResponseException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}?catch?(NoSuchAlgorithmException?e)?{e.printStackTrace();}?catch?(ServerException?e)?{e.printStackTrace();}?catch?(XmlParserException?e)?{e.printStackTrace();}return?null;}/***?@param?objectName?對象名稱*?@param?method?????方法*?@param?time???????時間*?@param?timeUnit???時間單位*?@return?{@link?String?}*?@Description?獲取上傳文件的url*?@Author?IT小輝同學*?@Date?2023/06/02*/public?String?getPolicyUrl(String?objectName,?Method?method,?int?time,?TimeUnit?timeUnit)?{try?{return?minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(method).bucket(configuration.getBucketName()).object(objectName).expiry(time,?timeUnit).build());}?catch?(ErrorResponseException?e)?{e.printStackTrace();}?catch?(InsufficientDataException?e)?{e.printStackTrace();}?catch?(InternalException?e)?{e.printStackTrace();}?catch?(InvalidKeyException?e)?{e.printStackTrace();}?catch?(InvalidResponseException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}?catch?(NoSuchAlgorithmException?e)?{e.printStackTrace();}?catch?(XmlParserException?e)?{e.printStackTrace();}?catch?(ServerException?e)?{e.printStackTrace();}return?null;}/***?@param?file?????文件*?@param?fileName?文件名稱*?@Description?上傳文件*?@Author?IT小輝同學*?@Date?2023/06/02*/public?void?upload(MultipartFile?file,?String?fileName)?{//?使用putObject上傳一個文件到存儲桶中。try?{InputStream?inputStream?=?file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).stream(inputStream,?file.getSize(),?-1).contentType(file.getContentType()).build());}?catch?(ErrorResponseException?e)?{e.printStackTrace();}?catch?(InsufficientDataException?e)?{e.printStackTrace();}?catch?(InternalException?e)?{e.printStackTrace();}?catch?(InvalidKeyException?e)?{e.printStackTrace();}?catch?(InvalidResponseException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}?catch?(NoSuchAlgorithmException?e)?{e.printStackTrace();}?catch?(ServerException?e)?{e.printStackTrace();}?catch?(XmlParserException?e)?{e.printStackTrace();}}/***?@param?objectName?對象名稱*?@param?time???????時間*?@param?timeUnit???時間單位*?@return?{@link?String?}*?@Description?根據filename獲取文件訪問地址*?@Author?IT小輝同學*?@Date?2023/06/02*/public?String?getUrl(String?objectName,?int?time,?TimeUnit?timeUnit)?{String?url?=?null;try?{url?=?minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(configuration.getBucketName()).object(objectName).expiry(time,?timeUnit).build());}?catch?(ErrorResponseException?e)?{e.printStackTrace();}?catch?(InsufficientDataException?e)?{e.printStackTrace();}?catch?(InternalException?e)?{e.printStackTrace();}?catch?(InvalidKeyException?e)?{e.printStackTrace();}?catch?(InvalidResponseException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}?catch?(NoSuchAlgorithmException?e)?{e.printStackTrace();}?catch?(XmlParserException?e)?{e.printStackTrace();}?catch?(ServerException?e)?{e.printStackTrace();}return?url;}/***?@param?fileName*?@return?{@link?ResponseEntity?}<{@link?byte[]?}>*?@Description?description:?下載文件*?@Author?IT小輝同學*?@Date?2023/06/02*/public?ResponseEntity<byte[]>?download(String?fileName)?{ResponseEntity<byte[]>?responseEntity?=?null;InputStream?in?=?null;ByteArrayOutputStream?out?=?null;try?{in?=?minioClient.getObject(GetObjectArgs.builder().bucket(configuration.getBucketName()).object(fileName).build());out?=?new?ByteArrayOutputStream();IOUtils.copy(in,?out);//封裝返回值byte[]?bytes?=?out.toByteArray();HttpHeaders?headers?=?new?HttpHeaders();try?{headers.add("Content-Disposition",?"attachment;filename="?+?URLEncoder.encode(fileName,?"UTF-8"));}?catch?(UnsupportedEncodingException?e)?{e.printStackTrace();}headers.setContentLength(bytes.length);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setAccessControlExposeHeaders(Arrays.asList("*"));responseEntity?=?new?ResponseEntity<byte[]>(bytes,?headers,?HttpStatus.SUCCESS);}?catch?(Exception?e)?{e.printStackTrace();}?finally?{try?{if?(in?!=?null)?{try?{in.close();}?catch?(IOException?e)?{e.printStackTrace();}}if?(out?!=?null)?{out.close();}}?catch?(IOException?e)?{e.printStackTrace();}}return?responseEntity;}/***?@param?objectFile?對象文件*?@return?{@link?String?}*?@Description?根據文件名和桶獲取文件路徑*?@Author?IT小輝同學*?@Date?2023/06/02*/public?String?getFileUrl(String?objectFile)?{try?{return?minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(configuration.getBucketName()).object(objectFile).build());}?catch?(Exception?e)?{e.printStackTrace();}return?null;}}

該代碼是一個工具類,用于使用阿里云的對象存儲服務(OSS)進行文件上傳和下載。具體功能如下:

  • getPolicy(String fileName, ZonedDateTime time):根據文件名和時間戳獲取上傳臨時簽名。

  • getPolicyUrl(String objectName, Method method, int time, TimeUnit timeUnit):獲取上傳文件的url。

  • upload(MultipartFile file, String fileName):將文件上傳到OSS中。

  • getUrl(String objectName, int time, TimeUnit timeUnit):獲取文件的下載url。

代碼中使用了枚舉類型來定義不同的上傳和下載方法。

使用了注解@Autowired來自動注入MinioClient對象。

該工具類沒有提供異常處理機制,需要根據實際情況進行補充。

創建Ajax請求工具類

/***?@Description?ajax結果*?@Author?IT小輝同學*?@Date?2023/06/01*/
public?class?AjaxResult?extends?HashMap<String,?Object>
{private?static?final?long?serialVersionUID?=?1L;/**?狀態碼?*/public?static?final?String?CODE_TAG?=?"code";/**?返回內容?*/public?static?final?String?MSG_TAG?=?"msg";/**?數據對象?*/public?static?final?String?DATA_TAG?=?"data";/***?初始化一個新創建的?AjaxResult?對象,使其表示一個空消息。*/public?AjaxResult(){}/***?初始化一個新創建的?AjaxResult?對象**?@param?code?狀態碼*?@param?msg?返回內容*/public?AjaxResult(int?code,?String?msg){super.put(CODE_TAG,?code);super.put(MSG_TAG,?msg);}/***?初始化一個新創建的?AjaxResult?對象**?@param?code?狀態碼*?@param?msg?返回內容*?@param?data?數據對象*/public?AjaxResult(int?code,?String?msg,?Object?data){super.put(CODE_TAG,?code);super.put(MSG_TAG,?msg);if?(data!=null){super.put(DATA_TAG,?data);}}/***?返回成功消息**?@return?成功消息*/public?static?AjaxResult?success(){return?AjaxResult.success("操作成功");}/***?返回成功數據**?@return?成功消息*/public?static?AjaxResult?success(Object?data){return?AjaxResult.success("操作成功",?data);}/***?返回成功消息**?@param?msg?返回內容*?@return?成功消息*/public?static?AjaxResult?success(String?msg){return?AjaxResult.success(msg,?null);}/***?返回成功消息**?@param?msg?返回內容*?@param?data?數據對象*?@return?成功消息*/public?static?AjaxResult?success(String?msg,?Object?data){return?new?AjaxResult(HttpStatus.SUCCESS,?msg,?data);}/***?返回警告消息**?@param?msg?返回內容*?@return?警告消息*/public?static?AjaxResult?warn(String?msg){return?AjaxResult.warn(msg,?null);}/***?返回警告消息**?@param?msg?返回內容*?@param?data?數據對象*?@return?警告消息*/public?static?AjaxResult?warn(String?msg,?Object?data){return?new?AjaxResult(HttpStatus.WARN,?msg,?data);}/***?返回錯誤消息**?@return?錯誤消息*/public?static?AjaxResult?error(){return?AjaxResult.error("操作失敗");}/***?返回錯誤消息**?@param?msg?返回內容*?@return?錯誤消息*/public?static?AjaxResult?error(String?msg){return?AjaxResult.error(msg,?null);}/***?返回錯誤消息**?@param?msg?返回內容*?@param?data?數據對象*?@return?錯誤消息*/public?static?AjaxResult?error(String?msg,?Object?data){return?new?AjaxResult(HttpStatus.ERROR,?msg,?data);}/***?返回錯誤消息**?@param?code?狀態碼*?@param?msg?返回內容*?@return?錯誤消息*/public?static?AjaxResult?error(int?code,?String?msg){return?new?AjaxResult(code,?msg,?null);}/***?方便鏈式調用**?@param?key?鍵*?@param?value?值*?@return?數據對象*/@Overridepublic?AjaxResult?put(String?key,?Object?value){super.put(key,?value);return?this;}
}

創建Minio文件操作接口層

package?com.xiaohui.controller;import?com.xiaohui.utils.AjaxResult;
import?com.xiaohui.utils.MinioUtils;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.http.ResponseEntity;
import?org.springframework.web.bind.annotation.*;
import?org.springframework.web.multipart.MultipartFile;import?java.util.HashMap;/***?@Description?minio文件上傳控制器*?@Author?IT小輝同學*?@Date?2023/06/02*/
@CrossOrigin
@RestController
@RequestMapping("/api")
public?class?MinioFileUploadController?{@Autowiredprivate?MinioUtils?minioUtils;/***?@param?file?????文件*?@param?fileName?文件名稱*?@return?{@link?AjaxResult?}*?@Description?上傳文件*?@Author?IT小輝同學*?@Date?2023/06/02*/@GetMapping("/upload")public?AjaxResult?uploadFile(@RequestParam("file")?MultipartFile?file,?String?fileName)?{minioUtils.upload(file,?fileName);return?AjaxResult.success("上傳成功");}/***?@param?fileName?文件名稱*?@return?{@link?ResponseEntity?}*?@Description?dowload文件*?@Author?IT小輝同學*?@Date?2023/06/02*/@GetMapping("/dowload")public?ResponseEntity?dowloadFile(@RequestParam("fileName")?String?fileName)?{return?minioUtils.download(fileName);}/***?@param?fileName?文件名稱*?@return?{@link?AjaxResult?}*?@Description?得到文件url*?@Author?IT小輝同學*?@Date?2023/06/02*/@GetMapping("/getUrl")public?AjaxResult?getFileUrl(@RequestParam("fileName")?String?fileName){HashMap?map=new?HashMap();map.put("FileUrl",minioUtils.getFileUrl(fileName));return?AjaxResult.success(map);}
}

功能測試

Minio大文件上傳

圖片

圖片

Minio大文件地址

圖片

圖片

最后說一句(求關注!別白嫖!)

如果這篇文章對您有所幫助,或者有所啟發的話,求一鍵三連:點贊、轉發、在看。

關注公眾號:woniuxgg,在公眾號中回復:筆記??就可以獲得蝸牛為你精心準備的java實戰語雀筆記,回復面試、開發手冊、有超贊的粉絲福利!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39045.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39045.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39045.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp入門

一、新建項目 進入到主界面&#xff0c;左上角點擊新建——1.項目 輸入項目名稱&#xff0c;Vue版本選擇3 二、創建頁面 選中左側文件目錄里的pages文件夾&#xff0c;右鍵&#xff0c;選擇新建頁面 1輸入名稱 2選中“創建同名目錄” 3選擇模板&…

將json對象轉為xml進行操作屬性

將json對象轉為xml進行操作屬性 文章目錄 將json對象轉為xml進行操作屬性前端發送json數據格式寫入數據庫格式-content字段存儲&#xff08;varchar(2000)&#xff09;Question實體類-接口映射對象QuestionContent 接收參數對象DAO持久層Mapper層Service層Controller控制層接收…

《每天5分鐘用Flask搭建一個管理系統》第13章:性能優化

第13章&#xff1a;性能優化 13.1 性能優化的重要性 性能優化確保應用能夠處理高并發請求&#xff0c;減少響應時間&#xff0c;提高用戶體驗和應用的可擴展性。 13.2 Flask緩存機制 緩存是提高Web應用性能的關鍵技術之一&#xff0c;它可以減少數據庫查詢次數和服務器計算…

Java 開發環境配置

配置Java開發環境涉及幾個主要步驟&#xff0c;包括安裝Java Development Kit (JDK)、配置環境變量和選擇集成開發環境&#xff08;IDE&#xff09;。以下是詳細的配置步驟&#xff1a; ### 1. 安裝 Java Development Kit (JDK) 1. **下載 JDK**&#xff1a; 訪問 Oracle …

完全指南:在Linux上安裝和精通Conda

前言 Conda是一個強大的包管理和環境管理工具&#xff0c;特別適用于數據科學和機器學習項目。本文將詳細指導你在Linux系統上安裝、配置和充分利用Conda的方法。 步驟一&#xff1a;下載和安裝Conda 下載安裝包&#xff1a; wget https://repo.anaconda.com/miniconda/Minic…

普元EOS學習筆記-低開實現圖書的增刪改查

前言 在前一篇《普元EOS學習筆記-創建精簡應用》中&#xff0c;我已經創建了EOS精簡應用。 我之前說過&#xff0c;EOS精簡應用就是自己創建的EOS精簡版&#xff0c;該項目中&#xff0c;開發者可以進行低代碼開發&#xff0c;也可以進行高代碼開發。 本文我就記錄一下自己在…

Golang中swtich中如何強制執行下一個代碼塊

switch 語句中的 case 代碼塊會默認帶上 break&#xff0c;但可以使用 fallthrough 來強制執行下一個 case 代碼塊。 package mainimport ("fmt" )func main() {isSpace : func(char byte) bool {switch char {case : // 空格符會直接 break&#xff0c;返回 false…

2024年6月 | deepin 深度應用商店-應用更新記錄

新增應用 序號應用名稱depein 系統版本應用分類應用類型1bkViewer 照片瀏覽器deepin 20.9 deepin V23網絡應用wine291助手deepin 20.9 deepin V23編程開發wine3風云CAD轉換器deepin 20.9 deepin V23編程開發wine4Disk Savvydeepin 20.9 deepin V23系統工具wine5飛貓盤…

miniconda3 安裝jupyter notebook并配置網絡訪問

由于服務器安裝的miniconda3&#xff0c;無jupyter notebook&#xff0c;所以手工安裝jupyter notebook 1 先conda 安裝相關包 在base 環境下 conda install ipython conda install jupyter notebook 2 生成配置文件 jupyter notebook --generate-config Writing defaul…

Nginx 常用配置與應用

Nginx 常用配置與應用 官網地址&#xff1a;https://nginx.org/en/docs/ 目錄 Nginx 常用配置與應用 Nginx總架構 正向代理 反向代理 Nginx 基本配置反向代理案例 負載均衡 Nginx總架構 進程模型 正向代理 反向代理 Nginx 基本配置反向代理案例 負載均衡 Nginx 基本配置…

新人程序員接手丑陋的老代碼怎么辦?改還是不改......

許多小伙伴在初入職場的時候&#xff0c;都會遇到要接手老代碼的情況&#xff0c;那么問題來了&#xff0c;如果老代碼十分丑陋&#xff0c;你是改還是不改&#xff1f; 不改吧&#xff0c;心里難受&#xff1b;改吧&#xff0c;指不定會遇到什么情況&#xff0c;比如…… 1.…

【嫦娥四號】月球著陸器中子和劑量測量(LND)實驗

一、引言 嫦娥四號任務是中國月球探測計劃的重要里程碑&#xff0c;實現了人類首次在月球背面軟著陸&#xff0c;并展開了月面巡視和中繼通信。本文所描述的嫦娥四號著陸器上的中子與劑量測定實驗&#xff08;Lunar Lander Neutrons and Dosimetry Experiment, LND&#xff09…

【雷豐陽-谷粒商城 】【分布式高級篇-微服務架構篇】【17】認證服務01

持續學習&持續更新中… 守破離 【雷豐陽-谷粒商城 】【分布式高級篇-微服務架構篇】【17】認證服務01 環境搭建驗證碼倒計時短信服務郵件服務驗證碼短信形式&#xff1a;郵件形式&#xff1a; 異常機制MD5參考 環境搭建 C:\Windows\System32\drivers\etc\hosts 192.168.…

嵌入式PCB制圖面試題及參考答案(2萬字長文)

目錄 如何設計適用于RF(射頻)應用的PCB? 介紹柔性PCB設計的基本考慮因素。 在高電壓PCB設計中,如何確保安全距離? 何為埋盲孔技術?在哪些應用中會用到? PCB設計項目管理的關鍵要素有哪些? 如何有效地與硬件工程師、機械工程師協同工作? 介紹一種提高設計審查效…

JAVA每日作業day7.1-7.3小總結

ok了家人們前幾天學了一些知識&#xff0c;接下來一起看看吧 一.API Java 的 API &#xff08; API: Application( 應用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供給我們使用的類&#xff0c;這些類將底層 的代碼實現封裝了起來&#x…

編寫高效的Java工具類:實用技巧與設計模式

編寫高效的Java工具類&#xff1a;實用技巧與設計模式 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 工具類的定義與作用 在軟件開發中&#xff0c;工具…

【echarts】拖拽滑塊dataZoom-slider自定義樣式,簡單適配移動端

電腦端 移動端 代碼片段 dataZoom: [{type: inside,start: 0,end: 100},{type: slider,backgroundColor: #F2F5F9,fillerColor: #BFCCE3,height: 13, // 設置slider的高度為15start: 0,end: 100,right: 60,left: 60,bottom: 15,handleIcon:path://M30.9,53.2C16.8,53.2,5.3,41.…

Linux源碼閱讀筆記12-RCU案例分析

在之前的文章中我們已經了解了RCU機制的原理和Linux的內核源碼&#xff0c;這里我們要根據RCU機制寫一個demo來展示他應該如何使用。 RCU機制的原理 RCU&#xff08;全稱為Read-Copy-Update&#xff09;,它記錄所有指向共享數據的指針的使用者&#xff0c;當要修改構想數據時&…

不要把面子太當回事

新手拍短視頻真人出鏡&#xff0c;會覺得拍視頻不自然怎么辦&#xff1f;感覺自己好傻。 其實不要把面子太當回事&#xff0c;堅持不把面子太當回事&#xff0c;反正剛開始也沒人看。這是真的事實&#xff0c;大家都非常忙&#xff0c;在你身上停留的時間就幾秒鐘。不要在腦海…

postgreSQL入門

PostgreSQL 教程 約束條件 not null, 不能為空 unique, 在所有數據中必須唯一 check, 字段設置條件 default, 字段默認值 primary(not null, unique), 主鍵, 不能為空且不能重復 數據庫操作 create database [name]; // 建立數據庫 drop database [name]; // 刪除數據庫 \c …