5分鐘解決SpringBoot集成minio文件服務器的過程

5分鐘解決SpringBoot集成minio文件服務器的過程

SpringBoot集成Minio

現在流行的文件服務器基本上有minio,fastdfs,那麼今天就說一下minio的安裝及集成

安裝部署minio

	<!--添加minio的依賴-->
		<dependency>
			<groupId>io.minio</groupId>
			<artifactId>minio</artifactId>
			<version>7.0.2</version>
		</dependency>
// 首先進入到你的目錄
cd /ext/minio
wget https://dl.minio.io/server/minio/release/linux-amd64/minio
//給予可執行
chmod +x minio
//啓動
minio server /ext/data
//或
minio server --config-dir=/ext/minio --address=:9000 //ext/data
//安裝基本上就這樣,啓動起來訪問一下 http://xxx.xx.xx.xx:9000/minio。一般默認安裝的默認用戶名密碼爲:minioadmin/minioadmin

在這裏插入圖片描述
在這裏插入圖片描述

開始和SpringBoot集成

/**
 * 文件管理對象 minio_files
 * 這裏是獲取配置文件中的實體信息
 * @author xxc
 * @date 2020-06-20
 */
public class MinioFiles extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** $column.columnComment */
    private Long id;
    @Excel(name = "用戶id")
    private Long userId;
    /** 文件路徑 */
    @Excel(name = "文件路徑")
    private String backetName;

    /** 文件名稱 */
    @Excel(name = "文件名稱")
    private String fileName;

    /** 文件大小 */
    @Excel(name = "文件大小")
    private Long fileSize;

    /** 文件後綴 */
    @Excel(name = "文件後綴")
    private String fileSuffix;

    /** 刪除標誌(0代表存在 2代表刪除) */
    private String delFlag;

    /** 文件類型 */
    @Excel(name = "文件類型")
    private String fileType;
    @Excel(name = "文件原名")
    private String fileOriginalName;
    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getFileOriginalName() {
        return fileOriginalName;
    }

    public void setFileOriginalName(String fileOriginalName) {
        this.fileOriginalName = fileOriginalName;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public Long getId() 
    {
        return id;
    }
    public void setBacketName(String backetName) 
    {
        this.backetName = backetName;
    }

    public String getBacketName() 
    {
        return backetName;
    }
    public void setFileName(String fileName) 
    {
        this.fileName = fileName;
    }

    public String getFileName() 
    {
        return fileName;
    }
    public void setFileSize(Long fileSize)
    {
        this.fileSize = fileSize;
    }

    public Long getFileSize()
    {
        return fileSize;
    }
    public void setFileSuffix(String fileSuffix) 
    {
        this.fileSuffix = fileSuffix;
    }

    public String getFileSuffix() 
    {
        return fileSuffix;
    }
    public void setDelFlag(String delFlag) 
    {
        this.delFlag = delFlag;
    }

    public String getDelFlag() 
    {
        return delFlag;
    }
    public void setFileType(String fileType) 
    {
        this.fileType = fileType;
    }

    public String getFileType() 
    {
        return fileType;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
            .append("id", getId()).append("userId", getUserId())
            .append("createBy", getCreateBy())
            .append("backetName", getBacketName())
            .append("fileName", getFileName())
            .append("fileSize", getFileSize())
            .append("fileSuffix", getFileSuffix())
            .append("createTime", getCreateTime())
            .append("delFlag", getDelFlag())
            .append("fileType", getFileType()).append("fileOriginalName", getFileOriginalName())
            .toString();
    }
}

import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.errors.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

@Component
@Configuration
public class MinIoUtils {

    private MinioConfig minIo;

    public MinIoUtils(MinioConfig minIo) {
        this.minIo = minIo;
    }

    private MinioClient instance;

    @PostConstruct
    public void init() {
        try {
            instance = new MinioClient(minIo.getUrl(),minIo.getAccessKey(),minIo.getSecretKey());
        } catch (InvalidPortException e) {
            e.printStackTrace();
        } catch (InvalidEndpointException e) {
            e.printStackTrace();
        }
    }

    /**
     * 判斷 bucket是否存在
     * @param bucketName
     * @return
     */
    public boolean bucketExists(String bucketName){
        try {
            return instance.bucketExists(bucketName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 創建 bucket
     * @param bucketName
     */
    public void makeBucket(String bucketName){
        try {
            boolean isExist = instance.bucketExists(bucketName);
            if(!isExist) {
                instance.makeBucket(bucketName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件上傳
     * @param bucketName
     * @param objectName
     * @param filename
     */
    public void putObject(String bucketName, String objectName, String filename){
        try {
            instance.putObject(bucketName,objectName,filename,null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 文件上傳
     * @param bucketName
     * @param multipartFile
     */
    public void putObject(String bucketName, MultipartFile multipartFile,String filename){
        try {
            // PutObjectOptions,上傳配置(文件大小,內存中文件分片大小)
            PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
            // 文件的ContentType
            putObjectOptions.setContentType(multipartFile.getContentType());
            instance.putObject(bucketName,filename,multipartFile.getInputStream(),putObjectOptions);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 刪除文件
     * @param objectName
     */
    public boolean removeObject(String objectName){
        boolean flag=true;
        try {
            instance.removeObject(minIo.getBucketName(),objectName);
        } catch (Exception e) {
            flag=false;
        }
        return flag;
    }
    public void downloadFile(String fileName,String originalName, HttpServletResponse response){
        try {

            InputStream file = instance.getObject(minIo.getBucketName(),fileName);
            String filename = new String(fileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8);
            if(StringUtils.isNotEmpty(originalName)){
                fileName=originalName;
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            ServletOutputStream servletOutputStream = response.getOutputStream();
            int len;
            byte[] buffer = new byte[1024];
            while((len=file.read(buffer)) > 0){
                servletOutputStream.write(buffer, 0, len);
            }
            servletOutputStream.flush();
            file.close();
            servletOutputStream.close();
        } catch (ErrorResponseException e) {
            e.printStackTrace();
        } catch (Exception  e) {
            e.printStackTrace();
        }
    }
}
//如果想使用直接注入使用既可以了。
@Service
public class MinioFilesServiceImpl implements IMinioFilesService {
    @Autowired
    private MinioFilesMapper minioFilesMapper;
    @Autowired
    private MinIoUtils minIoUtils;
    、、、、、、
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章