天天看點

使用minio修改頭像

使用minio修改頭像

自定義使用者和秘鑰安裝

1、這種安裝方式 MinIO 自定義 Access 和 Secret 密鑰要覆寫 MinIO 的自動生成的密鑰,您可以将 Access 和 Secret 密鑰設為環境變量。MinIO 允許正常字元串作為 Access 和 Secret 密鑰

docker run -p 9000:9000 --name minio \
--privileged=true\
-d --restart=always \
-e "MINIO_ACCESS_KEY=xiaohai" \
-e "MINIO_SECRET_KEY=admin123456" \
-v /home/data:/data \
-v /home/config:/root/.minio \
minio/minio server /data
           

登入用戶端

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-pjRHC7yV-1615906380405)(minio修改頭像.assets/image-20201226112521211.png)]

項目中使用:

依賴:

<!--        minio檔案存儲系統-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>7.0.2</version>
        </dependency>
           

配置檔案:

#minio檔案用戶端配置
minio:
  endpoint: 192.168.10.100
  port: 9000
  accessKey: xiaohai
  secretKey: admin123456
  secure: false
  bucketName: "lsh"
  configDir: "/data/"
           

配置類:

@Data
@Component
@ConfigurationProperties(prefix = "minio")
@ApiModel("minio配置")
public class MinioConfig {

    @ApiModelProperty("endPoint是一個URL,域名,IPv4或者IPv6位址")
    private String endpoint;

    @ApiModelProperty("TCP/IP端口号")
    private int port;

    @ApiModelProperty("accessKey類似于使用者ID,用于唯一辨別你的賬戶")
    private String accessKey;

    @ApiModelProperty("secretKey是你賬戶的密碼")
    private String secretKey;

    @ApiModelProperty("如果是true,則用的是https而不是http,預設值是true")
    private Boolean secure;

    @ApiModelProperty("預設存儲桶")
    private String bucketName;

    @ApiModelProperty("配置目錄")
    private String configDir;

    @Bean
    public MinioClient getMinioClient() throws InvalidEndpointException, InvalidPortException {
        MinioClient minioClient = new MinioClient(endpoint, port, accessKey, secretKey,secure);
        return minioClient;
    }
}
           

工具類

@Component
public class MinioUtil {

    @Autowired
    private MinioClient minioClient;

    private static final int DEFAULT_EXPIRY_TIME = 7 * 24 * 3600;

    /**
     * 檢查存儲桶是否存在
     *
     * @param bucketName 存儲桶名稱
     * @return
     */
    @SneakyThrows
    public boolean bucketExists(String bucketName) {
        boolean flag = false;
        flag = minioClient.bucketExists(bucketName);
        if (flag) {
            return true;
        }
        return false;
    }

    /**
     * 建立存儲桶
     *
     * @param bucketName 存儲桶名稱
     */
    @SneakyThrows
    public boolean makeBucket(String bucketName) {
        boolean flag = bucketExists(bucketName);
        if (!flag) {
            minioClient.makeBucket(bucketName);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 列出所有存儲桶名稱
     *
     * @return
     */
    @SneakyThrows
    public List<String> listBucketNames() {
        List<Bucket> bucketList = listBuckets();
        List<String> bucketListName = new ArrayList<>();
        for (Bucket bucket : bucketList) {
            bucketListName.add(bucket.name());
        }
        return bucketListName;
    }

    /**
     * 列出所有存儲桶
     *
     * @return
     */
    @SneakyThrows
    public List<Bucket> listBuckets() {
        return minioClient.listBuckets();
    }

    /**
     * 删除存儲桶
     *
     * @param bucketName 存儲桶名稱
     * @return
     */
    @SneakyThrows
    public boolean removeBucket(String bucketName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            Iterable<Result<Item>> myObjects = listObjects(bucketName);
            for (Result<Item> result : myObjects) {
                Item item = result.get();
                // 有對象檔案,則删除失敗
                if (item.size() > 0) {
                    return false;
                }
            }
            // 删除存儲桶,注意,隻有存儲桶為空時才能删除成功。
            minioClient.removeBucket(bucketName);
            flag = bucketExists(bucketName);
            if (!flag) {
                return true;
            }

        }
        return false;
    }

    /**
     * 列出存儲桶中的所有對象名稱
     *
     * @param bucketName 存儲桶名稱
     * @return
     */
    @SneakyThrows
    public List<String> listObjectNames(String bucketName) {
        List<String> listObjectNames = new ArrayList<>();
        boolean flag = bucketExists(bucketName);
        if (flag) {
            Iterable<Result<Item>> myObjects = listObjects(bucketName);
            for (Result<Item> result : myObjects) {
                Item item = result.get();
                listObjectNames.add(item.objectName());
            }
        }
        return listObjectNames;
    }

    /**
     * 列出存儲桶中的所有對象
     *
     * @param bucketName 存儲桶名稱
     * @return
     */
    @SneakyThrows
    public Iterable<Result<Item>> listObjects(String bucketName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            return minioClient.listObjects(bucketName);
        }
        return null;
    }

    /**
     * 通過檔案上傳到對象
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @param fileName   File name
     * @return
     */
    @SneakyThrows
    public boolean putObject(String bucketName, String objectName, String fileName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            minioClient.putObject(bucketName, objectName, fileName, null);
            ObjectStat statObject = statObject(bucketName, objectName);
            if (statObject != null && statObject.length() > 0) {
                return true;
            }
        }
        return false;

    }

    /**
     * 檔案上傳
     *
     * @param bucketName
     * @param multipartFile
     */
    @SneakyThrows
    public void putObject(String bucketName, MultipartFile multipartFile, String filename) {
        PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
        putObjectOptions.setContentType(multipartFile.getContentType());
        minioClient.putObject(bucketName, filename, multipartFile.getInputStream(), putObjectOptions);
    }

    /**
     * 通過InputStream上傳對象
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @param stream     要上傳的流
     * @return
     */
    @SneakyThrows
    public boolean putObject(String bucketName, String objectName, InputStream stream) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            minioClient.putObject(bucketName, objectName, stream, new PutObjectOptions(stream.available(), -1));
            ObjectStat statObject = statObject(bucketName, objectName);
            if (statObject != null && statObject.length() > 0) {
                return true;
            }
        }
        return false;
    }

    /**
     * 以流的形式擷取一個檔案對象
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @return
     */
    @SneakyThrows
    public InputStream getObject(String bucketName, String objectName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            ObjectStat statObject = statObject(bucketName, objectName);
            if (statObject != null && statObject.length() > 0) {
                InputStream stream = minioClient.getObject(bucketName, objectName);
                return stream;
            }
        }
        return null;
    }

    /**
     * 以流的形式擷取一個檔案對象(斷點下載下傳)
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @param offset     起始位元組的位置
     * @param length     要讀取的長度 (可選,如果無值則代表讀到檔案結尾)
     * @return
     */
    @SneakyThrows
    public InputStream getObject(String bucketName, String objectName, long offset, Long length) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            ObjectStat statObject = statObject(bucketName, objectName);
            if (statObject != null && statObject.length() > 0) {
                InputStream stream = minioClient.getObject(bucketName, objectName, offset, length);
                return stream;
            }
        }
        return null;
    }

    /**
     * 下載下傳并将檔案儲存到本地
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @param fileName   File name
     * @return
     */
    @SneakyThrows
    public boolean getObject(String bucketName, String objectName, String fileName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            ObjectStat statObject = statObject(bucketName, objectName);
            if (statObject != null && statObject.length() > 0) {
                minioClient.getObject(bucketName, objectName, fileName);
                return true;
            }
        }
        return false;
    }

    /**
     * 删除一個對象
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     */
    @SneakyThrows
    public boolean removeObject(String bucketName, String objectName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            minioClient.removeObject(bucketName, objectName);
            return true;
        }
        return false;
    }

    /**
     * 删除指定桶的多個檔案對象,傳回删除錯誤的對象清單,全部删除成功,傳回空清單
     *
     * @param bucketName  存儲桶名稱
     * @param objectNames 含有要删除的多個object名稱的疊代器對象
     * @return
     */
    @SneakyThrows
    public List<String> removeObject(String bucketName, List<String> objectNames) {
        List<String> deleteErrorNames = new ArrayList<>();
        boolean flag = bucketExists(bucketName);
        if (flag) {
            Iterable<Result<DeleteError>> results = minioClient.removeObjects(bucketName, objectNames);
            for (Result<DeleteError> result : results) {
                DeleteError error = result.get();
                deleteErrorNames.add(error.objectName());
            }
        }
        return deleteErrorNames;
    }

    /**
     * 生成一個給HTTP GET請求用的presigned URL。
     * 浏覽器/移動端的用戶端可以用這個URL進行下載下傳,即使其所在的存儲桶是私有的。這個presigned URL可以設定一個失效時間,預設值是7天。
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @param expires    失效時間(以秒為機關),預設是7天,不得大于七天
     * @return
     */
    @SneakyThrows
    public String presignedGetObject(String bucketName, String objectName, Integer expires) {
        boolean flag = bucketExists(bucketName);
        String url = "";
        if (flag) {
            if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) {
                throw new InvalidExpiresRangeException(expires,
                        "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);
            }
            url = minioClient.presignedGetObject(bucketName, objectName, expires);
        }
        return url;
    }

    /**
     * 生成一個給HTTP PUT請求用的presigned URL。
     * 浏覽器/移動端的用戶端可以用這個URL進行上傳,即使其所在的存儲桶是私有的。這個presigned URL可以設定一個失效時間,預設值是7天。
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @param expires    失效時間(以秒為機關),預設是7天,不得大于七天
     * @return
     */
    @SneakyThrows
    public String presignedPutObject(String bucketName, String objectName, Integer expires) {
        boolean flag = bucketExists(bucketName);
        String url = "";
        if (flag) {
            if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) {
                throw new InvalidExpiresRangeException(expires,
                        "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME);
            }
            url = minioClient.presignedPutObject(bucketName, objectName, expires);
        }
        return url;
    }

    /**
     * 擷取對象的中繼資料
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @return
     */
    @SneakyThrows
    public ObjectStat statObject(String bucketName, String objectName) {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            ObjectStat statObject = minioClient.statObject(bucketName, objectName);
            return statObject;
        }
        return null;
    }

    /**
     * 檔案通路路徑
     *
     * @param bucketName 存儲桶名稱
     * @param objectName 存儲桶裡的對象名稱
     * @return
     */
    @SneakyThrows
    public String getObjectUrl(String bucketName, String objectName) {
        boolean flag = bucketExists(bucketName);
        String url = "";
        if (flag) {
            url = minioClient.getObjectUrl(bucketName, objectName);
        }
        return url;
    }



    public void downloadFile(String bucketName, String fileName, String originalName, HttpServletResponse response) {
        try {

            InputStream file = minioClient.getObject(bucketName, 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();
        }
    }

}
           

使用類:

@Resource
   private MinioUtil minioUtil;
   
   @Value("${minio.bucketName}")
   private String bucketName;

   @PostMapping("/userface")
    public RespBean upload(ChangeHeadImg img){
       log.info("上傳檔案"+img.getFile().getOriginalFilename());
       String fileName = img.getUsername()+System.currentTimeMillis();
       minioUtil.putObject(bucketName, img.getFile(),fileName );
       //檔案路徑
       String url=minioUtil.getObjectUrl(bucketName, fileName);
       Admin admin=new Admin();
       admin.setEnabled(img.getEnabled());
       admin.setId(img.getId());
       admin.setUserFace(url);
       String userFace = img.getUserFace();
       boolean b = adminService.updateById(admin);
       if (b){
           minioUtil.removeObject(bucketName,userFace.substring(userFace.lastIndexOf("/")+1));
           return RespBean.success("修改成功");
       }

       return RespBean.error(300,"修改失敗");
   }