Java精選面試題(微信小程序):5000+道面試題和選擇題,真實面經,簡歷模版,包含Java基礎、并發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!
什么是minio
MinIO是一個基于Go實現的高性能、兼容S3協議的對象存儲。它采用GNU AGPL v3開源協議,項目地址是https://github.com/minio/minio。
引用官網:
MinIO是根據GNU Affero通用公共許可證v3.0發布的高性能對象存儲。它與Amazon S3云存儲服務兼容。使用MinIO構建用于機器學習,分析和應用程序數據工作負載的高性能基礎架構。
官網地址:
https://min.io/
文檔地址:
https://docs.min.io/一. 使用docker 搭建minio 服務GNU / Linux和macOS
docker run -p 9000:9000 \ --name minio1 \ -v /mnt/data:/data \ -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \ -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \ minio/minio server /datawindows
docker run -p 9000:9000 \ --name minio1 \ -v D:\data:/data \ -e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE" \ -e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \ minio/minio server /dataMINIO_ROOT_USER:為用戶keyMINIO_ROOT_PASSWORD:為用戶密鑰
以上搭建的都是單機版的。想要了解分布式 的方式請查看官網文檔。
這就是在win的docker上運行的。
更多開源項目:https://www.yoodb.com/projects/springboot-user-manger.html
當啟動后在瀏覽器訪問http://localhost:9000就可以訪問minio的圖形化界面了,如圖所示:
![]()
![]()
二. 下面開始搭建springboot 環境
初始化一個springboot項目大家都會,這里不多做介紹。
主要是介紹需要引入的依賴:
org.springframework.boot spring-boot-starter-thymeleaf io.minio minio 8.2.1 org.projectlombok lombok true 依賴可以官方文檔里找:https://docs.min.io/docs/java-client-quickstart-guide.html
下面介紹配置文件:
spring: servlet: multipart: max-file-size: 10MB max-request-size: 10MB #minio配置 minio: access-key: AKIAIOSFODNN7EXAMPLE #key就是docker初始化是設置的,密鑰相同 secret-key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY url: http://localhost:9000 bucket-name: wdhcr thymeleaf: cache: false創建minio的配置類:
@Configuration @ConfigurationProperties(prefix = "spring.minio") @Data public class MinioConfiguration { private String accessKey; private String secretKey; private String url; private String bucketName; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(url) .credentials(accessKey, secretKey) .build(); } }使用配置屬性綁定進行參數綁定,并初始化一個minio client對象放入容器中。
下面就是我封裝的minio client 操作minio的簡單方法的組件。
@Component public class MinioComp { @Autowired private MinioClient minioClient; @Autowired private MinioConfiguration configuration; /** * @description: 獲取上傳臨時簽名,公眾 號Java精選 * @dateTime: 2021/5/13 14:12 */ public Map getPolicy(String fileName, ZonedDateTime time) { PostPolicy postPolicy = new PostPolicy(configuration.getBucketName(), time); postPolicy.addEqualsCondition("key", fileName); try { Map map = minioClient.getPresignedPostFormData(postPolicy); HashMap 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; } /** * @description: 獲取上傳文件的url,公眾 號Java精選,有驚喜! * @dateTime: 2021/5/13 14:15 */ 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; } /** * @description: 上傳文件 * @dateTime: 2021/5/13 14:17 */ 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(); } } /** * @description: 根據filename獲取文件訪問地址 * @dateTime: 2021/5/17 11:28 */ 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; } }簡單說明:
使用MultipartFile接收前端文件流,再上傳到minio。
構建一個formData的簽名數據,給前端,讓前端之前上傳到minio。
構建一個可以上傳的臨時URL給前端,前端通過攜帶文件請求該URL進行上傳。
使用filename請求服務端獲取臨時訪問文件的URL。(最長時間為7 天,想要永久性訪問,需要其他設置,這里不做說明。)
推薦,公眾 號Java精選,回復java面試,獲取面試資料,支持在線刷題。
下面展示頁面html,使用的是VUE+element-ui進行渲染。
"UTF-8"> "stylesheet" > 上傳圖片 "app" > "2" > "8" > "div-center-class" > "" > 傳統上傳 upload-demo" action= "#" drag :http-request= "uploadHandle" > "el-icon-upload"> "el-upload__text" >將文件拖到此處,或點擊上傳 "el-upload__tip" slot= "tip" >只能上傳jpg/png文件,且不超過500kb "imgUrl" > "imgUrl" style="width: 40px;height: 40px"> "8" > "div-center-class" > "" > 前端formData直傳 upload-demo" action= "#" drag :http-request= "httpRequestHandle" > "el-icon-upload"> "el-upload__text" >將文件拖到此處,或點擊上傳 "el-upload__tip" slot= "tip" >只能上傳jpg/png文件,且不超過500kb "directUrl" > "directUrl" style="width: 40px;height: 40px"> "8" > "div-center-class" > "" > 前端Url直傳 upload-demo" action= "#" drag :http-request= "UrlUploadHandle" > "el-icon-upload"> "el-upload__text" >將文件拖到此處,或點擊上傳 "el-upload__tip" slot= "tip" >只能上傳jpg/png文件,且不超過500kb "uploadUrl" > "uploadUrl" style="width: 40px;height: 40px"> ![]()
頁面的效果就如上圖所示。
可以分別體驗不同的實現效果。
以上就是使用springboot搭建基于minio的高性能存儲服務的全部步驟了。
本項目地址:
https://gitee.com/jack_whh/minio-upload
作者:HUWD https://blog.csdn.net/weixin_45089791/article/details/116921075/
公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!
最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!
文章有幫助的話,點在看,轉發吧!
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.