diff --git a/src/main/java/com/ycwl/basic/device/DeviceFactory.java b/src/main/java/com/ycwl/basic/device/DeviceFactory.java index 812cec5..3bd6213 100644 --- a/src/main/java/com/ycwl/basic/device/DeviceFactory.java +++ b/src/main/java/com/ycwl/basic/device/DeviceFactory.java @@ -4,9 +4,9 @@ import com.ycwl.basic.device.checker.IDeviceStatusChecker; import com.ycwl.basic.device.checker.impl.AliOssDeviceChecker; import com.ycwl.basic.device.checker.impl.AlwaysOnDeviceChecker; import com.ycwl.basic.device.enums.DeviceStoreTypeEnum; +import com.ycwl.basic.device.operator.AliOssStorageOperator; import com.ycwl.basic.device.operator.IDeviceStorageOperator; -import com.ycwl.basic.device.operator.impl.AliOssStorageOperator; -import com.ycwl.basic.device.operator.impl.LocalStorageOperator; +import com.ycwl.basic.device.operator.LocalStorageOperator; import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; diff --git a/src/main/java/com/ycwl/basic/device/checker/impl/AlwaysOnDeviceChecker.java b/src/main/java/com/ycwl/basic/device/checker/impl/AlwaysOnDeviceChecker.java index 05ed4b2..33e515c 100644 --- a/src/main/java/com/ycwl/basic/device/checker/impl/AlwaysOnDeviceChecker.java +++ b/src/main/java/com/ycwl/basic/device/checker/impl/AlwaysOnDeviceChecker.java @@ -1,7 +1,6 @@ package com.ycwl.basic.device.checker.impl; import com.ycwl.basic.device.checker.IDeviceStatusChecker; -import com.ycwl.basic.device.checker.helper.CommonDeviceChecker; import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; import com.ycwl.basic.model.pc.device.entity.DeviceEntity; import lombok.Setter; diff --git a/src/main/java/com/ycwl/basic/device/entity/alioss/DeviceAliOssConfig.java b/src/main/java/com/ycwl/basic/device/entity/alioss/DeviceAliOssConfig.java index 0ae272a..20d856e 100644 --- a/src/main/java/com/ycwl/basic/device/entity/alioss/DeviceAliOssConfig.java +++ b/src/main/java/com/ycwl/basic/device/entity/alioss/DeviceAliOssConfig.java @@ -1,7 +1,6 @@ package com.ycwl.basic.device.entity.alioss; import lombok.Data; -import org.apache.commons.lang3.StringUtils; @Data public class DeviceAliOssConfig { diff --git a/src/main/java/com/ycwl/basic/device/operator/ADeviceStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/ADeviceStorageOperator.java new file mode 100644 index 0000000..3657aa7 --- /dev/null +++ b/src/main/java/com/ycwl/basic/device/operator/ADeviceStorageOperator.java @@ -0,0 +1,12 @@ +package com.ycwl.basic.device.operator; + +import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; +import com.ycwl.basic.model.pc.device.entity.DeviceEntity; +import lombok.Setter; + +public abstract class ADeviceStorageOperator implements IDeviceStorageOperator { + @Setter + protected DeviceEntity device; + @Setter + protected DeviceConfigEntity deviceConfig; +} diff --git a/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java new file mode 100644 index 0000000..ba3cecf --- /dev/null +++ b/src/main/java/com/ycwl/basic/device/operator/AliOssStorageOperator.java @@ -0,0 +1,109 @@ +package com.ycwl.basic.device.operator; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.ycwl.basic.device.entity.common.FileObject; +import com.ycwl.basic.storage.StorageFactory; +import com.ycwl.basic.storage.adapters.IStorageAdapter; +import com.ycwl.basic.storage.entity.AliOssStorageConfig; +import com.ycwl.basic.storage.entity.StorageFileObject; +import com.ycwl.basic.storage.enums.StorageType; +import lombok.extern.slf4j.Slf4j; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +public class AliOssStorageOperator extends ADeviceStorageOperator { + private IStorageAdapter adapter; + + public AliOssStorageOperator(String configJson) { + loadConfig(configJson); + } + + @Override + public void loadConfig(String configJson) { + AliOssStorageConfig config = JSON.parseObject(configJson, AliOssStorageConfig.class); + adapter = StorageFactory.get(StorageType.ALI_OSS, config); + } + + + private List getOssObjectListByPrefix(String prefix) { + return adapter.listDir(prefix); + } + + private List getOssFileListByPrefix(String prefix) { + List objectList = getOssObjectListByPrefix(prefix); + if (objectList == null) { + return null; + } + return objectList.stream().filter(item -> item.getName().endsWith(".ts")).map(item -> { + FileObject object = new FileObject(); + object.setPath(item.getPath()); + object.setUrl(adapter.getUrlForDownload(item.getFullPath())); + object.setNeedDownload(true); + String[] splitDir = item.getPath().split("/"); + String splitDate = splitDir[splitDir.length - 1]; + String[] splitExt = item.getName().split("\\.", 2); + String[] splitDt = splitExt[0].split("_", 2); + String createTime = splitDt[0]; + String endTime = splitDt[1]; + object.setName(item.getName()); + object.setEndTime(DateUtil.parse(splitDate+endTime, "yyyyMMddHHmmss")); + object.setCreateTime(DateUtil.parse(splitDate+createTime, "yyyyMMddHHmmss")); + return object; + }).collect(Collectors.toList()); + } + + private boolean removeFilesByPrefix(String prefix) { + return adapter.deleteDir(prefix); + } + + @Override + public List getFileListByDtRange(Date startDate, Date endDate) { + if (startDate == null || endDate == null) { + return null; + } + List fileList = new ArrayList<>(); + if (startDate.after(endDate)) { + return fileList; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(startDate); + calendar.set(Calendar.SECOND, 0); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/HHmm"); + while (calendar.getTime().before(endDate)) { + String prefix = dateFormat.format(calendar.getTime()); + List fileListByPrefix = getOssFileListByPrefix(prefix); + if (fileListByPrefix == null) { + return null; + } + fileList.addAll(fileListByPrefix); + calendar.add(Calendar.MINUTE, 1); + } + calendar.clear(); + return fileList.stream() + .sorted(Comparator.comparing(FileObject::getCreateTime)) + .filter(item -> item.getCreateTime().after(startDate)) + .filter(item -> item.getCreateTime().before(endDate)) + .collect(Collectors.toList()); + } + + @Override + public boolean removeFilesBeforeDate(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.HOUR_OF_DAY, 0); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/"); + calendar.add(Calendar.DAY_OF_MONTH, -1); + String prefix = dateFormat.format(calendar.getTime()); + return removeFilesByPrefix(prefix); + } +} diff --git a/src/main/java/com/ycwl/basic/device/operator/IDeviceStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/IDeviceStorageOperator.java index e8b28cd..434961a 100644 --- a/src/main/java/com/ycwl/basic/device/operator/IDeviceStorageOperator.java +++ b/src/main/java/com/ycwl/basic/device/operator/IDeviceStorageOperator.java @@ -7,6 +7,8 @@ import java.util.Date; import java.util.List; public interface IDeviceStorageOperator extends IDeviceCommon { + void loadConfig(String configJson); + /** * 获取指定时间范围内的文件列表 * diff --git a/src/main/java/com/ycwl/basic/device/operator/LocalStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/LocalStorageOperator.java new file mode 100644 index 0000000..7dc7dfa --- /dev/null +++ b/src/main/java/com/ycwl/basic/device/operator/LocalStorageOperator.java @@ -0,0 +1,37 @@ +package com.ycwl.basic.device.operator; + +import com.ycwl.basic.device.entity.common.FileObject; +import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; +import com.ycwl.basic.model.pc.device.entity.DeviceEntity; +import lombok.Setter; + +import java.util.Collections; +import java.util.Date; +import java.util.List; + +public class LocalStorageOperator implements IDeviceStorageOperator { + @Setter + private DeviceEntity device; + @Setter + private DeviceConfigEntity deviceConfig; + + public LocalStorageOperator(String configJson) { + loadConfig(configJson); + } + + @Override + public void loadConfig(String configJson) { + + } + + @Override + public List getFileListByDtRange(Date startDate, Date endDate) { + return Collections.emptyList(); + } + + @Override + public boolean removeFilesBeforeDate(Date date) { + return false; + } + +} diff --git a/src/main/java/com/ycwl/basic/device/operator/helper/CommonPieceGetter.java b/src/main/java/com/ycwl/basic/device/operator/helper/CommonPieceGetter.java deleted file mode 100644 index 9c73030..0000000 --- a/src/main/java/com/ycwl/basic/device/operator/helper/CommonPieceGetter.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.ycwl.basic.device.operator.helper; - -import com.alibaba.fastjson.JSON; -import com.ycwl.basic.model.pc.device.entity.DeviceConfigEntity; -import com.ycwl.basic.model.pc.device.entity.DeviceEntity; -import lombok.Setter; - -public abstract class CommonPieceGetter { - protected C config; - @Setter - private DeviceEntity device; - @Setter - private DeviceConfigEntity deviceConfig; - - public CommonPieceGetter(String configJson) { - config = JSON.parseObject(configJson, getConfigClass()); - } - - @SuppressWarnings("unchecked") - private Class getConfigClass() { - return (Class) ((java.lang.reflect.ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; - } - -} diff --git a/src/main/java/com/ycwl/basic/device/operator/impl/AliOssStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/impl/AliOssStorageOperator.java deleted file mode 100644 index 7b9310f..0000000 --- a/src/main/java/com/ycwl/basic/device/operator/impl/AliOssStorageOperator.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.ycwl.basic.device.operator.impl; - -import cn.hutool.core.date.DateUtil; -import com.aliyun.oss.HttpMethod; -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.aliyun.oss.OSSException; -import com.aliyun.oss.model.DeleteObjectsRequest; -import com.aliyun.oss.model.ListObjectsV2Request; -import com.aliyun.oss.model.ListObjectsV2Result; -import com.aliyun.oss.model.OSSObjectSummary; -import com.ycwl.basic.device.entity.alioss.DeviceAliOssConfig; -import com.ycwl.basic.device.entity.common.FileObject; -import com.ycwl.basic.device.operator.IDeviceStorageOperator; -import com.ycwl.basic.device.operator.helper.CommonPieceGetter; -import lombok.extern.slf4j.Slf4j; - -import java.net.URL; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; - -@Slf4j -public class AliOssStorageOperator extends CommonPieceGetter implements IDeviceStorageOperator { - public AliOssStorageOperator(String configJson) { - super(configJson); - } - - private OSS getClient() { - return new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); - } - - private List getOssObjectListByPrefix(String prefix) { - OSS ossClient = getClient(); - ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request(config.getBucketName()); - listObjectsV2Request.setPrefix(config.getPrefix() + prefix); - listObjectsV2Request.setMaxKeys(1000); - boolean isTruncated = true; - String continuationToken = null; - List objectList = new ArrayList<>(); - try { - while (isTruncated) { - if (continuationToken != null) { - listObjectsV2Request.setContinuationToken(continuationToken); - } - - // 列举文件。 - ListObjectsV2Result result = ossClient.listObjectsV2(listObjectsV2Request); - - objectList.addAll(result.getObjectSummaries()); - - isTruncated = result.isTruncated(); - continuationToken = result.getNextContinuationToken(); - } - return objectList; - } catch (OSSException e) { - log.error("获取OSS文件列表失败", e); - } - return null; - } - - private List getOssFileListByPrefix(String prefix) { - OSS ossClient = getClient(); - List objectList = getOssObjectListByPrefix(prefix); - if (objectList == null) { - return null; - } - return objectList.stream().filter(item -> item.getKey().endsWith(".ts")).map(item -> { - FileObject object = new FileObject(); - object.setPath(item.getKey()); - URL url = ossClient.generatePresignedUrl(item.getBucketName(), item.getKey(), DateUtil.offsetHour(new Date(), 8), HttpMethod.GET); - object.setUrl(url.toString()); - object.setNeedDownload(true); - String[] splitDir = item.getKey().split("/"); - String splitDate = splitDir[splitDir.length - 2]; - String splitName = splitDir[splitDir.length - 1]; - String[] splitExt = splitName.split("\\.", 2); - String[] splitDt = splitExt[0].split("_", 2); - String createTime = splitDt[0]; - String endTime = splitDt[1]; - object.setName(splitName); - object.setEndTime(DateUtil.parse(splitDate+endTime, "yyyyMMddHHmmss")); - object.setCreateTime(DateUtil.parse(splitDate+createTime, "yyyyMMddHHmmss")); - return object; - }).collect(Collectors.toList()); - } - - private boolean removeFilesByPrefix(String prefix) { - OSS ossClient = getClient(); - List objectList = getOssObjectListByPrefix(prefix); - if (objectList == null) { - return false; - } - int idx = 0; - int batchSize = 999; - while (objectList.size() > idx) { - if (objectList.size() - idx < batchSize) { - batchSize = objectList.size() - idx; - } - List subList = objectList.subList(idx, idx + batchSize); - idx += batchSize; - DeleteObjectsRequest request = new DeleteObjectsRequest(config.getBucketName()); - request.setKeys(subList.stream().map(OSSObjectSummary::getKey).collect(Collectors.toList())); - try { - ossClient.deleteObjects(request); - } catch (OSSException e) { - return false; - } - } - ossClient.shutdown(); - return true; - } - - @Override - public List getFileListByDtRange(Date startDate, Date endDate) { - if (startDate == null || endDate == null) { - return null; - } - List fileList = new ArrayList<>(); - if (startDate.after(endDate)) { - return fileList; - } - Calendar calendar = Calendar.getInstance(); - calendar.setTime(startDate); - calendar.set(Calendar.SECOND, 0); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/HHmm"); - while (calendar.getTime().before(endDate)) { - String prefix = dateFormat.format(calendar.getTime()); - List fileListByPrefix = getOssFileListByPrefix(prefix); - if (fileListByPrefix == null) { - return null; - } - fileList.addAll(fileListByPrefix); - calendar.add(Calendar.MINUTE, 1); - } - calendar.clear(); - return fileList.stream() - .sorted(Comparator.comparing(FileObject::getCreateTime)) - .filter(item -> item.getCreateTime().after(startDate)) - .filter(item -> item.getCreateTime().before(endDate)) - .collect(Collectors.toList()); - } - - @Override - public boolean removeFilesBeforeDate(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd/"); - calendar.add(Calendar.DAY_OF_MONTH, -1); - String prefix = dateFormat.format(calendar.getTime()); - return removeFilesByPrefix(prefix); - } -} diff --git a/src/main/java/com/ycwl/basic/device/operator/impl/LocalStorageOperator.java b/src/main/java/com/ycwl/basic/device/operator/impl/LocalStorageOperator.java deleted file mode 100644 index d321f85..0000000 --- a/src/main/java/com/ycwl/basic/device/operator/impl/LocalStorageOperator.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.ycwl.basic.device.operator.impl; - -import com.ycwl.basic.device.entity.common.FileObject; -import com.ycwl.basic.device.entity.local.DeviceLocalConfig; -import com.ycwl.basic.device.operator.IDeviceStorageOperator; -import com.ycwl.basic.device.operator.helper.CommonPieceGetter; - -import java.util.Collections; -import java.util.Date; -import java.util.List; - -public class LocalStorageOperator extends CommonPieceGetter implements IDeviceStorageOperator { - public LocalStorageOperator(String configJson) { - super(configJson); - } - - @Override - public List getFileListByDtRange(Date startDate, Date endDate) { - return Collections.emptyList(); - } - - @Override - public boolean removeFilesBeforeDate(Date date) { - return false; - } -} diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java index 725a7fb..e2e23da 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/FaceServiceImpl.java @@ -187,10 +187,4 @@ public class FaceServiceImpl implements FaceService { return ApiResponse.success(resp); } - @Override - public ApiResponse getFaceByMemberId(Long memberId) { - // TODO: 修改 - return ApiResponse.success(faceMapper.getByMemberId(memberId, 3928516560393736192L)); - } - } diff --git a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java index cd23c19..be2084d 100644 --- a/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/task/TaskTaskServiceImpl.java @@ -185,15 +185,14 @@ public class TaskTaskServiceImpl implements TaskService { @Override public void autoCreateTaskByFaceId(Long id) { FaceRespVO faceRespVO = faceMapper.getById(id); - if (StringUtils.isNotBlank(faceRespVO.getMatchSampleIds())) { - List faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList())); - if (faceSampleList.isEmpty()) { - return; - } - } else { + if (!StringUtils.isNotBlank(faceRespVO.getMatchSampleIds())) { return; } - List templateList = templateMapper.listByScenicId(faceRespVO.getScenicId()); + List faceSampleList = faceSampleMapper.listByIds(Arrays.stream(faceRespVO.getMatchSampleIds().split(",")).map(Long::valueOf).collect(Collectors.toList())); + if (faceSampleList.isEmpty()) { + return; + } + List templateList = templateMapper.listEnabledByScenicId(faceRespVO.getScenicId()); if (templateList == null || templateList.isEmpty()) { return; } diff --git a/src/main/java/com/ycwl/basic/service/pc/FaceService.java b/src/main/java/com/ycwl/basic/service/pc/FaceService.java index d0e58ae..6907660 100644 --- a/src/main/java/com/ycwl/basic/service/pc/FaceService.java +++ b/src/main/java/com/ycwl/basic/service/pc/FaceService.java @@ -23,6 +23,4 @@ public interface FaceService { ApiResponse update(FaceEntity face); ApiResponse faceUpload(MultipartFile file, Long scrnicId); - - ApiResponse getFaceByMemberId(Long memberId); } diff --git a/src/main/java/com/ycwl/basic/storage/StorageFactory.java b/src/main/java/com/ycwl/basic/storage/StorageFactory.java index 78a84eb..34b83c0 100644 --- a/src/main/java/com/ycwl/basic/storage/StorageFactory.java +++ b/src/main/java/com/ycwl/basic/storage/StorageFactory.java @@ -38,15 +38,15 @@ public class StorageFactory { return get(storageType); } - protected static Map definedName = new HashMap<>(); + protected static Map namedStorage = new HashMap<>(); protected static IStorageAdapter defaultStorage = null; public static void register(String name, IStorageAdapter adapter) { - definedName.put(name, adapter); + namedStorage.put(name, adapter); } public static IStorageAdapter use(String name) { - IStorageAdapter adapter = definedName.get(name); + IStorageAdapter adapter = namedStorage.get(name); if (adapter == null) { throw new StorageUndefinedException("未定义的存储方式:"+name); } diff --git a/src/main/java/com/ycwl/basic/storage/adapters/AStorageAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/AStorageAdapter.java index 79d99df..f97fa73 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/AStorageAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/AStorageAdapter.java @@ -37,6 +37,11 @@ public abstract class AStorageAdapter implements IStorageAdapter { } } + @Override + public String getUrlForDownload(String... path) { + return getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), path); + } + @Override public String getUrlForUpload(String... path) { return getUrlForUpload(new Date(System.currentTimeMillis() + 1000 * 60 * 60), path); diff --git a/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java index aa63ea1..784e05e 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/AliOssAdapter.java @@ -5,18 +5,29 @@ import com.aliyun.oss.ClientException; import com.aliyun.oss.HttpMethod; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.DeleteObjectsRequest; +import com.aliyun.oss.model.ListObjectsV2Request; +import com.aliyun.oss.model.ListObjectsV2Result; +import com.aliyun.oss.model.OSSObjectSummary; import com.aliyun.oss.model.PutObjectRequest; import com.ycwl.basic.storage.entity.AliOssStorageConfig; import com.ycwl.basic.storage.entity.StorageConfig; +import com.ycwl.basic.storage.entity.StorageFileObject; import com.ycwl.basic.storage.exceptions.StorageConfigException; +import com.ycwl.basic.storage.exceptions.StorageException; import com.ycwl.basic.storage.exceptions.UploadFileFailedException; import com.ycwl.basic.storage.utils.StorageUtil; import org.apache.commons.lang3.StringUtils; import java.io.InputStream; import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; final public class AliOssAdapter extends AStorageAdapter { private AliOssStorageConfig config; @@ -80,6 +91,13 @@ final public class AliOssAdapter extends AStorageAdapter { return config.getUrl() + "/" + buildPath(path); } + @Override + public String getUrlForDownload(Date expireDate, String... path) { + OSS ossClient = getOssClient(); + URL url = ossClient.generatePresignedUrl(config.getBucketName(), buildPath(path), expireDate, HttpMethod.GET); + return url.toString(); + } + @Override public String getUrlForUpload(Date expireDate, String... path) { OSS ossClient = getOssClient(); @@ -87,6 +105,68 @@ final public class AliOssAdapter extends AStorageAdapter { return url.toString(); } + @Override + public List listDir(String... path) { + OSS ossClient = getOssClient(); + ListObjectsV2Request listObjectsV2Request = new ListObjectsV2Request(config.getBucketName()); + listObjectsV2Request.setPrefix(buildPath(path)); + listObjectsV2Request.setMaxKeys(1000); + boolean isTruncated = true; + String continuationToken = null; + List objectList = new ArrayList<>(); + try { + while (isTruncated) { + if (continuationToken != null) { + listObjectsV2Request.setContinuationToken(continuationToken); + } + + // 列举文件。 + ListObjectsV2Result result = ossClient.listObjectsV2(listObjectsV2Request); + + objectList.addAll(result.getObjectSummaries()); + + isTruncated = result.isTruncated(); + continuationToken = result.getNextContinuationToken(); + } + return objectList.stream().map(item -> { + StorageFileObject object = new StorageFileObject(); + object.setPath(item.getKey().substring(0, item.getKey().lastIndexOf("/"))); + object.setName(item.getKey().substring(item.getKey().lastIndexOf("/") + 1)); + object.setSize(item.getSize()); + object.setRawObject(item); + return object; + }).collect(Collectors.toList()); + } catch (OSSException e) { + throw new StorageException("列举文件失败:" + e.getErrorMessage()); + } + } + + @Override + public boolean deleteDir(String... path) { + List objectList = listDir(buildPath(path)); + OSS ossClient = getOssClient(); + if (objectList.isEmpty()) { + return true; + } + int idx = 0; + int batchSize = 999; + while (objectList.size() > idx) { + if (objectList.size() - idx < batchSize) { + batchSize = objectList.size() - idx; + } + List subList = objectList.subList(idx, idx + batchSize); + idx += batchSize; + DeleteObjectsRequest request = new DeleteObjectsRequest(config.getBucketName()); + request.setKeys(subList.stream().map(StorageFileObject::getFullPath).collect(Collectors.toList())); + try { + ossClient.deleteObjects(request); + } catch (OSSException e) { + return false; + } + } + return true; + } + private OSS getOssClient() { OSS ossClient = new OSSClientBuilder().build(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); return ossClient; diff --git a/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java index 8cd9aee..fba6cd9 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/IStorageAdapter.java @@ -1,11 +1,13 @@ package com.ycwl.basic.storage.adapters; import com.ycwl.basic.storage.entity.StorageConfig; +import com.ycwl.basic.storage.entity.StorageFileObject; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.InputStream; import java.util.Date; +import java.util.List; import java.util.Map; public interface IStorageAdapter { @@ -16,6 +18,10 @@ public interface IStorageAdapter { String uploadFile(MultipartFile file, String ...path); boolean deleteFile(String ...path); String getUrl(String ...path); + String getUrlForDownload(String ...path); + String getUrlForDownload(Date expireDate, String ...path); String getUrlForUpload(String ...path); String getUrlForUpload(Date expireDate, String ...path); + List listDir(String ...path); + boolean deleteDir(String ...path); } diff --git a/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java b/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java index 71e2497..265238a 100644 --- a/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java +++ b/src/main/java/com/ycwl/basic/storage/adapters/LocalStorageAdapter.java @@ -1,9 +1,12 @@ package com.ycwl.basic.storage.adapters; import com.ycwl.basic.storage.entity.StorageConfig; +import com.ycwl.basic.storage.entity.StorageFileObject; import java.io.InputStream; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Map; public class LocalStorageAdapter extends AStorageAdapter{ @@ -32,8 +35,23 @@ public class LocalStorageAdapter extends AStorageAdapter{ return ""; } + @Override + public String getUrlForDownload(Date expireDate, String... path) { + return ""; + } + @Override public String getUrlForUpload(Date expireDate, String... path) { return ""; } + + @Override + public List listDir(String... path) { + return Collections.emptyList(); + } + + @Override + public boolean deleteDir(String... path) { + return false; + } } diff --git a/src/main/java/com/ycwl/basic/storage/entity/StorageFileObject.java b/src/main/java/com/ycwl/basic/storage/entity/StorageFileObject.java new file mode 100644 index 0000000..381c56e --- /dev/null +++ b/src/main/java/com/ycwl/basic/storage/entity/StorageFileObject.java @@ -0,0 +1,20 @@ +package com.ycwl.basic.storage.entity; + +import lombok.Data; + +@Data +public class StorageFileObject { + private String path; + private String name; + private Long size; + private Object rawObject; + + public String getFullPath() { + return path + "/" + name; + } + + public void setFullPath(String path) { + this.path = path.substring(0, path.lastIndexOf("/")); + this.name = path.substring(path.lastIndexOf("/") + 1); + } +}