package com.fdkankan.scene.oss.aliyun; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.aliyun.oss.OSS; import com.aliyun.oss.model.*; import com.fdkankan.scene.constant.CmdConstant; import com.fdkankan.scene.oss.Consumer; import com.fdkankan.scene.oss.InnerUtils; import com.fdkankan.scene.oss.OssOptions; import com.fdkankan.scene.util.CmdUtils; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.util.Base64Utils; import org.springframework.util.StringUtils; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * 阿里云操作模版类, 简化常见操作 */ @Getter @Slf4j public class AliyunOssTemplate implements OssOptions { private final OSS ossClient; private final AliyunOssProperties ossProperties; AliyunOssTemplate(OSS ossClient, AliyunOssProperties ossProperties) { this.ossClient = ossClient; this.ossProperties = ossProperties; } @Override public void uploadFileChunkCmd(String defaultFolder, String sceneCode, String uploadDir, String targetDir, String mergeCode) { String cmd = CmdConstant.OSSUTIL_UPLOAD_DIR_CHUNK; cmd = cmd.replaceAll("@defaultFolder", defaultFolder); cmd = cmd.replaceAll("@sceneCode", sceneCode); cmd = cmd.replaceAll("@mergeCode", mergeCode); cmd = cmd.replaceAll("@uploadDir", uploadDir); cmd = cmd.replaceAll("@target", targetDir); CmdUtils.ossUploadDir(cmd); } @Override public void uploadFileDirCmd(String uploadDir, String target) { String cmd = CmdConstant.OSSUTIL_UPLOAD_DIR; cmd = cmd.replaceAll("@uploadDir", uploadDir); cmd = cmd.replaceAll("@target", target); CmdUtils.ossUploadDir(cmd); } @Override public String uploadFile(String pathKey, String filePath) { return uploadFile(ossProperties.getBucket(), pathKey, filePath); } @Override public void rmFileCmd(String targetDir) { String cmd = CmdConstant.OSSUTIL_RM_DIR; cmd = cmd.replaceAll("@target", targetDir); CmdUtils.ossDeleteDir(cmd); } @Override public String uploadFile(String bucket, String pathKey, String filePath) { InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty"); InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty"); ObjectMetadata metadata = new ObjectMetadata(); ossClient.putObject(bucket, pathKey, new File(filePath), metadata); return pathKey; } @Override public String uploadFileText(String pathKey, String content) { return uploadFileText(ossProperties.getBucket(), pathKey, content); } @Override public String uploadFileText(String bucket, String pathKey, String content) { byte[] bytes = content.getBytes(StandardCharsets.UTF_8); return uploadFileBytes(bucket, pathKey, bytes); } @Override public String uploadFileBase64Image(String pathKey, String content) { return uploadFileBase64Image(ossProperties.getBucket(), pathKey, content); } @Override public String uploadFileBase64Image(String bucket, String pathKey, String content) { byte[] bytes = Base64Utils.decodeFromString(content); return uploadFileBytes(bucket, pathKey, bytes); } @Override public String uploadFileBytes(String pathKey, byte[] bytes) { return uploadFileBytes(ossProperties.getBucket(), pathKey, bytes); } @Override public String uploadFileBytes(String bucket, String pathKey, byte[] bytes) { ByteArrayInputStream stream = new ByteArrayInputStream(bytes); return uploadFileStream(bucket, pathKey, stream); } @Override public String uploadFileStream(String pathKey, InputStream stream) { return uploadFileStream(ossProperties.getBucket(), pathKey, stream); } @Override public String uploadFileStream(String bucket, String pathKey, InputStream stream) { InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty"); InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty"); InnerUtils.checkArgument(stream != null, "stream can't be null"); ObjectMetadata metadata = new ObjectMetadata(); ossClient.putObject(bucket, pathKey, stream, metadata); return pathKey; } @Override public File downloadFileTmp(String pathKey) { return downloadFileTmp(ossProperties.getBucket(), pathKey); } @Override public File downloadFileTmp(String bucket, String pathKey) { String tmpDir = System.getProperty("java.io.tmpdir"); String file = tmpDir + UUID.randomUUID(); downloadFile(bucket, pathKey, file); return new File(file); } @Override public ObjectMetadata downloadFile(String pathKey, String file) { return downloadFile(ossProperties.getBucket(), pathKey, file); } @Override public ObjectMetadata downloadFile(String bucket, String pathKey, String file) { InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty"); InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty"); InnerUtils.checkArgument(file != null && file.length() > 0, "file can't be empty"); GetObjectRequest request = new GetObjectRequest(bucket, pathKey); AliyunOssTemplate.log.info("下载开始:下载bucket={},下载pathKey={},下载filePath={}", bucket, pathKey, file); return ossClient.getObject(request, new File(file)); } @Override public ObjectMetadata downloadFile(String pathKey, Consumer handler) { return downloadFile(ossProperties.getBucket(), pathKey, handler); } @Override public ObjectMetadata downloadFile(String bucket, String pathKey, Consumer handler) { InnerUtils.checkArgument(bucket != null && bucket.length() > 0, "bucket can't be empty"); InnerUtils.checkArgument(pathKey != null && pathKey.length() > 0, "pathKey can't be empty"); InnerUtils.checkArgument(handler != null, "handler can't be null"); OSSObject ossObject = ossClient.getObject(bucket, pathKey); InputStream content = ossObject.getObjectContent(); try { handler.accept(content); } finally { if (content != null) { try { content.close(); } catch (IOException e) { // Ignore } } } return ossObject.getObjectMetadata(); } public String calculateUrl(String pathKey) { return pathKey; } public String calculateUrl(String bucket, String pathKey) { String host = ossProperties.getHostByBucket(bucket); return host + "/" + pathKey; } public String calculatePathKey(String url) { String urlPath = InnerUtils.getUrlPath(url); if (urlPath != null && urlPath.startsWith("/")) { String pathKey = urlPath.substring(1); if (pathKey.length() > 0) { return InnerUtils.decodeUrl(pathKey); } } return null; } public String calculateHost(String endpoint, String bucket) { return InnerUtils.generateHost(endpoint, bucket); } @Override public Boolean copyObject(String oldPath, String newPath) { return copyObject(ossProperties.getBucket(), oldPath, ossProperties.getBucket(), newPath); } @Override public Boolean copyObject(String bucket, String oldPath, String toBucket, String newPath) { AliyunOssTemplate.log.info("拷贝开始:oldBucket={},oldPath={},newBucket={},newPath={}", bucket, oldPath, toBucket, newPath); String versionId = ossClient.copyObject(bucket, oldPath, toBucket, newPath).getVersionId(); return StrUtil.isNotBlank(versionId); } @Override public void deleteObject(String keyName) { if (!doesObjectExist(keyName)) { deleteObject(ossProperties.getBucket(), keyName); } else { AliyunOssTemplate.log.warn("文件不存在,KeyName{}", keyName); } } @Override public void deleteObject(String bucket, String keyName) { ossClient.deleteObject(bucket, keyName); } @Override public List getFileFolder(String keyName) { return getFileFolder(ossProperties.getBucket(), keyName); } @Override public List getFileFolder(String bucket, String keyName) { ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossProperties.getBucket()); // 设置正斜线(/)为文件夹的分隔符。 listObjectsRequest.setDelimiter("/"); // 设置prefix参数来获取fun目录下的所有文件。 if (!StringUtils.isEmpty(keyName)) { listObjectsRequest.setPrefix(keyName + "/"); } ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍历所有commonPrefix List list = new ArrayList<>(); for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { list.add(objectSummary.getKey()); } AliyunOssTemplate.log.info("获取文件夹集合={}", JSON.toJSONString(list)); return list; } @Override public boolean doesObjectExist(String bucket, String keyName) { boolean b = ossClient.doesObjectExist(bucket, keyName); AliyunOssTemplate.log.info("文件是否存在={}", b); return b; } @Override public boolean doesObjectExist(String keyName) { return doesObjectExist(ossProperties.getBucket(), keyName); } @Override public String uploadFileImage(String pathKey, String filePath) { return uploadFileImage(ossProperties.getBucket(), pathKey, filePath); } @Override public String uploadFileImage(String bucket, String pathKey, String filePath) { ObjectMetadata metadata = new ObjectMetadata(); if (filePath.contains(".jpg")) { metadata.setContentType("image/jpeg"); } else if (filePath.contains(".png")) { metadata.setContentType("image/png"); } AliyunOssTemplate.log.info("上传开始:上传bucket={},上传pathKey={},上传filePath={}", bucket, pathKey, filePath); ossClient.putObject(bucket, pathKey, new File(filePath), metadata); return calculateUrl(bucket, pathKey); } }