使用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,"修改失敗");
}