Docker安裝Minio+SpringBoot上傳下載文件方式
更新時間:2024年10月31日 14:49:59 作者:Xiao_zuo_ya
本文主要介紹了如何通過Docker安裝Minio并進行訪問測試,同時也講解了如何在SpringBoot中上傳文件到Minio,內(nèi)容包含了pom文件引入依賴,application.properties配置,Minio配置,MinioClinet,FileService,FileServiceImpl的配置
Docker安裝Minio
docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外掛磁盤存儲使用 mkdir -p /usr/local/minio/data # 外掛配置文件使用 mkdir -p /usr/local/minio/config # 創(chuàng)建minio 容器 docker run -d --name minio -p 9000:9000 -p 9001:9001 -v /usr/local/minio/data:/data -v /usr/local/minio/config:/root/.minio -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWO RD=admin minio/minio server /data --console-address ":9001" # 創(chuàng)建失敗 docker logs minio FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials > Please provide correct credentials HINT: MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters # 密碼不能少于8個字符 docker rm minio docker run -d --name minio -p 9000:9000 -p 9001:9001 -v /usr/local/minio/data:/data -v /usr/local/minio/config:/root/.minio -e MINIO_ROOT_USER=admin -e MINIO_ROOT_PASSWO RD=admin123 minio/minio server /data --console-address ":9001" # 防火墻開放端口 firewall-cmd --zone=public --add-port=9000/tcp --permanent firewall-cmd --zone=public --add-port=9001/tcp --permanent # 重啟防火墻 sudo firewall-cmd --reload
訪問測試
http://ip:9001
SpringBoot上傳文件到Minio
pom文件引入依賴
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.5.2</version> </dependency>
application.properties配置Minio
spring.minio.access-key=pNehtjUDw9ENBlULVTGT spring.minio.secret-key=p3yVngZ2Ei1uCtn6vKozrof6ICB7GFBiYPr5RAWW spring.minio.endpoint=http://192.168.10.227:9000
配置MinioClinet
@Data @Configuration @ConfigurationProperties(prefix = "spring.minio") @Slf4j public class MinioConfig { private String accessKey; private String secretKey; private String endpoint; @Bean public MinioClient minioClient() { return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } }
FileService
public interface FileService { /** * 是否存在桶 */ Boolean bucketExists(String bucketName); /** * 創(chuàng)建桶 */ void makeBucket(String bucketName); /** * 刪除桶 */ void removeBucket(String bucketName); /** * 獲取當(dāng)所有桶 */ List<Bucket> getAllBuckets(); /** * 上傳文件 */ String uploadFile(String bucketName, String prefix, MultipartFile file) throws Exception; /** * 文件預(yù)覽 */ String preview(String bucketName, String prefix, String fileName) throws Exception; /** * 文件下載 */ void download(String bucketName, String prefix, String fileName, HttpServletResponse res); /** * 刪除文件 */ Boolean removeFile(String bucketName, String prefix, String fileName); /** * 文件是否存在 */ boolean isFileExists(String bucketName, String prefix, String fileName) throws Exception; /** * 生成一個帶到期時間、簽名的URL,這個地址可以提供給沒有登錄的第三方共享訪問或者上傳對象,針對于Bucket為私有的情況 */ String getPresignedObjectUrl(String bucketName, String prefix, String fileName); }
FileServiceImpl
package com.example.demo.service.impl; import java.util.List; import java.util.Objects; import java.util.UUID; import javax.servlet.http.HttpServletResponse; import cn.hutool.core.io.file.FileNameUtil; import com.example.demo.service.FileService; import io.minio.*; import io.minio.http.Method; import io.minio.messages.Bucket; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** * @author :王建 * @since :2024-10-10 11:38 */ @Service @Slf4j public class FileServiceImpl implements FileService { @Autowired private MinioClient minioClient; @Override public Boolean bucketExists(String bucketName) { try { return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } catch (Exception e) { throw new RuntimeException(e); } } @Override public void makeBucket(String bucketName) { try { minioClient.makeBucket(MakeBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { throw new RuntimeException(e); } } @Override public void removeBucket(String bucketName) { try { minioClient.removeBucket(RemoveBucketArgs.builder() .bucket(bucketName) .build()); } catch (Exception e) { throw new RuntimeException(e); } } @Override public List<Bucket> getAllBuckets() { try { return minioClient.listBuckets(); } catch (Exception e) { throw new RuntimeException(e); } } @Override public String uploadFile(String bucketName, String prefix, MultipartFile file) throws Exception { String uuid = UUID.randomUUID().toString(); // 重新命名原來文件 String fileName = uuid + "." + FileNameUtil.extName(file.getOriginalFilename()); log.info("源文件名稱:{},重命名后文件名稱:{}", file.getOriginalFilename(), fileName); String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName; PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(objectName) .stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build(); minioClient.putObject(objectArgs); return uuid; } @Override public String preview(String bucketName, String prefix, String fileName) throws Exception { // 查看文件地址 String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName; GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build(); return minioClient.getPresignedObjectUrl(build); } @Override public void download(String bucketName, String prefix, String fileName, HttpServletResponse res) { } @Override public Boolean removeFile(String bucketName, String prefix, String fileName) { return null; } @Override public boolean isFileExists(String bucketName, String prefix, String fileName) throws Exception { String objectName = StringUtils.isBlank(prefix) ? fileName : "/" + prefix + "/" + fileName; StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); return !Objects.isNull(statObjectResponse); } @Override public String getPresignedObjectUrl(String bucketName, String prefix, String fileName) { return null; } }
配置Minio允許直接預(yù)覽PDF文件
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用docker?部署mysql突然連接不上的問題及解決方法
這篇文章主要介紹了使用docker?部署mysql,突然連接不上,要解決這個問題需要找到根本原因,對癥治療就好,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06詳解Docker中安裝配置Oracle數(shù)據(jù)庫
本篇文章主要介紹了詳解Docker中安裝配置Oracle數(shù)據(jù)庫,具有一定的參考價值,有興趣的可以了解一下。2017-04-04詳解在Docker容器中運行Spring Boot應(yīng)用
本文將以一個最簡單的Spring Boot開發(fā)的Web應(yīng)用為例,講解如何將其容器化運行。本文的重點是構(gòu)建Docker鏡像、運行Docker容器。2017-06-06手工制作docker鏡像-包含多個服務(wù)ssh+nginx
這篇文章主要介紹了手工制作docker鏡像-包含多個服務(wù)ssh+nginx,需要的朋友可以參考下2024-07-07解決Docker之mysql容器數(shù)據(jù)庫更改不生效的問題
這篇文章主要介紹了解決Docker之mysql容器數(shù)據(jù)庫更改不生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11