package com.dji.sample.component.oss.service.impl;
|
|
import com.dji.sample.component.oss.model.OssConfiguration;
|
import com.dji.sample.component.oss.service.IOssService;
|
import com.dji.sample.media.model.param.CredentialsParam;
|
import com.dji.sdk.cloudapi.storage.CredentialsToken;
|
import com.dji.sdk.cloudapi.storage.OssTypeEnum;
|
import io.minio.*;
|
import io.minio.credentials.AssumeRoleProvider;
|
import io.minio.credentials.Credentials;
|
import io.minio.credentials.StaticProvider;
|
import io.minio.errors.*;
|
import io.minio.http.Method;
|
import io.minio.messages.Item;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.StringUtils;
|
|
import java.io.ByteArrayInputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.net.URL;
|
import java.security.InvalidKeyException;
|
import java.security.NoSuchAlgorithmException;
|
import java.util.Objects;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* @author sean
|
* @version 0.3
|
* @date 2021/12/23
|
*/
|
@Service
|
@Slf4j
|
public class MinIOServiceImpl implements IOssService {
|
|
private MinioClient client;
|
|
@Override
|
public OssTypeEnum getOssType() {
|
return OssTypeEnum.MINIO;
|
}
|
|
@Override
|
public CredentialsToken getCredentials() {
|
try {
|
AssumeRoleProvider provider = new AssumeRoleProvider(OssConfiguration.endpointSpare, OssConfiguration.accessKey,
|
OssConfiguration.secretKey, Math.toIntExact(OssConfiguration.expire),
|
null, OssConfiguration.region, null, null, null, null);
|
Credentials credential = provider.fetch();
|
return new CredentialsToken(credential.accessKey(), credential.secretKey(), credential.sessionToken(), OssConfiguration.expire);
|
} catch (NoSuchAlgorithmException e) {
|
log.debug("Failed to obtain sts.");
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
@Override
|
public URL getObjectUrl(String bucket, String objectKey) {
|
try {
|
return new URL(
|
client.getPresignedObjectUrl(
|
GetPresignedObjectUrlArgs.builder()
|
.method(Method.GET)
|
.bucket(bucket)
|
.object(objectKey)
|
.expiry(Math.toIntExact(OssConfiguration.expire))
|
.build()));
|
} catch (ErrorResponseException | InsufficientDataException | InternalException |
|
InvalidKeyException | InvalidResponseException | IOException |
|
NoSuchAlgorithmException | XmlParserException | ServerException e) {
|
throw new RuntimeException("The file does not exist on the OssConfiguration.");
|
}
|
}
|
|
@Override
|
public Boolean deleteObject(String bucket, String objectKey) {
|
try {
|
client.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectKey).build());
|
} catch (MinioException | NoSuchAlgorithmException | IOException | InvalidKeyException e) {
|
log.error("Failed to delete file.");
|
e.printStackTrace();
|
return false;
|
}
|
return true;
|
}
|
|
@Override
|
public InputStream getObject(String bucket, String objectKey) {
|
try {
|
GetObjectResponse object = client.getObject(GetObjectArgs.builder().bucket(bucket).object(objectKey).build());
|
return new ByteArrayInputStream(object.readAllBytes());
|
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) {
|
e.printStackTrace();
|
}
|
return InputStream.nullInputStream();
|
}
|
|
@Override
|
public void putObject(String bucket, String objectKey, InputStream input) {
|
try {
|
client.statObject(StatObjectArgs.builder().bucket(bucket).object(objectKey).build());
|
throw new RuntimeException("The filename already exists.");
|
} catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException e) {
|
log.info("The file does not exist, start uploading.");
|
try {
|
ObjectWriteResponse response = client.putObject(
|
PutObjectArgs.builder().bucket(bucket).object(objectKey).stream(input, input.available(), 0).build());
|
log.info("Upload FlighttaskCreateFile: {}", response.etag());
|
} catch (MinioException | IOException | InvalidKeyException | NoSuchAlgorithmException ex) {
|
log.error("Failed to upload FlighttaskCreateFile {}.", objectKey);
|
ex.printStackTrace();
|
}
|
}
|
}
|
/**
|
* 列出某个桶中的所有文件名
|
* 文件夹名为空时,则直接查询桶下面的数据,否则就查询当前桶下对于文件夹里面的数据
|
*
|
* @param bucketName 桶名称
|
* @param folderName 文件夹名
|
* @param isDeep 是否递归查询
|
*/
|
public Iterable<Result<Item>> getBucketAllFile(String bucketName, String folderName, Boolean isDeep) throws Exception {
|
if (!StringUtils.hasLength(bucketName)) {
|
throw new RuntimeException("获取桶中文件列表的时候,桶名不能为空!");
|
}
|
if (!StringUtils.hasLength(folderName)) {
|
folderName = "";
|
}
|
System.out.println(folderName);
|
Iterable<Result<Item>> listObjects = client.listObjects(
|
ListObjectsArgs
|
.builder()
|
.bucket(bucketName)
|
.prefix(folderName + "/")
|
.recursive(isDeep)
|
.build());
|
|
// for (Result<Item> result : listObjects) {
|
// Item item = result.get();
|
// System.out.println(item.objectName());
|
// }
|
|
return listObjects;
|
}
|
|
|
public void createClient() {
|
if (Objects.nonNull(this.client)) {
|
return;
|
}
|
this.client = MinioClient.builder()
|
.endpoint(OssConfiguration.endpoint)
|
.credentials(OssConfiguration.accessKey, OssConfiguration.secretKey)
|
.region(OssConfiguration.region)
|
.build();
|
}
|
// 获得一个 可过期的 URL
|
public static String getPresignedObjectUrl(String objectKey, CredentialsParam credentials) throws ErrorResponseException, InsufficientDataException, InternalException, InvalidKeyException, InvalidResponseException, IOException, NoSuchAlgorithmException, XmlParserException, ServerException {
|
StaticProvider staticProvider = new StaticProvider(credentials.getAccessKey(), credentials.getSecretKey(), credentials.getSessionToken());
|
MinioClient minioClient = MinioClient.builder().endpoint(OssConfiguration.endpoint).credentialsProvider(staticProvider).build();
|
String url =
|
minioClient.getPresignedObjectUrl(
|
GetPresignedObjectUrlArgs.builder()
|
.method(Method.GET)
|
.bucket(OssConfiguration.bucket)
|
.object(objectKey)
|
.expiry(credentials.getExpiration(), TimeUnit.HOURS) //过期时间
|
//.extraQueryParams(reqParams)
|
.build());
|
System.out.println(url);
|
return url;
|
}
|
}
|