123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- 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<ObjectMetadata> {
- 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<InputStream> handler) {
- return downloadFile(ossProperties.getBucket(), pathKey, handler);
- }
- @Override
- public ObjectMetadata downloadFile(String bucket, String pathKey, Consumer<InputStream> 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<String> getFileFolder(String keyName) {
- return getFileFolder(ossProperties.getBucket(), keyName);
- }
- @Override
- public List<String> 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<String> 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);
- }
- }
|