|
@@ -0,0 +1,172 @@
|
|
|
+package cc.iotkit.oss.service.impl;
|
|
|
+
|
|
|
+import cc.iotkit.oss.service.OssTemplate;
|
|
|
+import com.amazonaws.services.s3.AmazonS3;
|
|
|
+import com.amazonaws.services.s3.model.*;
|
|
|
+import com.amazonaws.util.IOUtils;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.SneakyThrows;
|
|
|
+
|
|
|
+import java.io.ByteArrayInputStream;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.net.URL;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.GregorianCalendar;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Author: 石恒
|
|
|
+ * @Date: 2023/5/22 21:14
|
|
|
+ * @Description:
|
|
|
+ */
|
|
|
+
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class OssTemplateImpl implements OssTemplate {
|
|
|
+
|
|
|
+ private final AmazonS3 amazonS3;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建Bucket
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html
|
|
|
+ * @param bucketName bucket名称
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public void createBucket(String bucketName) {
|
|
|
+ if ( !amazonS3.doesBucketExistV2(bucketName) ) {
|
|
|
+ amazonS3.createBucket((bucketName));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有的buckets
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public List<Bucket> getAllBuckets() {
|
|
|
+ return amazonS3.listBuckets();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过Bucket名称删除Bucket
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html
|
|
|
+ * @param bucketName
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public void removeBucket(String bucketName) {
|
|
|
+ amazonS3.deleteBucket(bucketName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 上传对象
|
|
|
+ * @param bucketName bucket名称
|
|
|
+ * @param objectName 文件名称
|
|
|
+ * @param stream 文件流
|
|
|
+ * @param contextType 文件类型
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public void putObject(String bucketName, String objectName, InputStream stream, String contextType) {
|
|
|
+ putObject(bucketName, objectName, stream, stream.available(), contextType);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 上传对象
|
|
|
+ * @param bucketName bucket名称
|
|
|
+ * @param objectName 文件名称
|
|
|
+ * @param stream 文件流
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public void putObject(String bucketName, String objectName, InputStream stream) {
|
|
|
+ putObject(bucketName, objectName, stream, stream.available(), "application/octet-stream");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过bucketName和objectName获取对象
|
|
|
+ * @param bucketName bucket名称
|
|
|
+ * @param objectName 文件名称
|
|
|
+ * @return
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public S3Object getObject(String bucketName, String objectName) {
|
|
|
+ return amazonS3.getObject(bucketName, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取对象的url
|
|
|
+ * @param bucketName
|
|
|
+ * @param objectName
|
|
|
+ * @param expires
|
|
|
+ * @return
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_GeneratePresignedUrl.html
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public String getObjectURL(String bucketName, String objectName, Integer expires) {
|
|
|
+ Date date = new Date();
|
|
|
+ Calendar calendar = new GregorianCalendar();
|
|
|
+ calendar.setTime(date);
|
|
|
+ calendar.add(Calendar.DAY_OF_MONTH, expires);
|
|
|
+ URL url = amazonS3.generatePresignedUrl(bucketName, objectName, calendar.getTime());
|
|
|
+ return url.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过bucketName和objectName删除对象
|
|
|
+ * @param bucketName
|
|
|
+ * @param objectName
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public void removeObject(String bucketName, String objectName) {
|
|
|
+ amazonS3.deleteObject(bucketName, objectName);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据bucketName和prefix获取对象集合
|
|
|
+ * @param bucketName bucket名称
|
|
|
+ * @param prefix 前缀
|
|
|
+ * @param recursive 是否递归查询
|
|
|
+ * @return
|
|
|
+ * AmazonS3:https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @SneakyThrows
|
|
|
+ public List<S3ObjectSummary> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive) {
|
|
|
+ ObjectListing objectListing = amazonS3.listObjects(bucketName, prefix);
|
|
|
+ return objectListing.getObjectSummaries();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param bucketName
|
|
|
+ * @param objectName
|
|
|
+ * @param stream
|
|
|
+ * @param size
|
|
|
+ * @param contextType
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @SneakyThrows
|
|
|
+ private PutObjectResult putObject(String bucketName, String objectName, InputStream stream, long size,
|
|
|
+ String contextType) {
|
|
|
+
|
|
|
+ byte[] bytes = IOUtils.toByteArray(stream);
|
|
|
+ ObjectMetadata objectMetadata = new ObjectMetadata();
|
|
|
+ objectMetadata.setContentLength(size);
|
|
|
+ objectMetadata.setContentType(contextType);
|
|
|
+ ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
|
|
|
+ // 上传
|
|
|
+ return amazonS3.putObject(bucketName, objectName, byteArrayInputStream, objectMetadata);
|
|
|
+
|
|
|
+ }
|
|
|
+}
|