feat: 咖啡因缓存设置,桶与大小分离

This commit is contained in:
zlg
2024-07-16 11:26:45 +08:00
parent 02ffaac9c1
commit 35ae89ad3e
4 changed files with 253 additions and 170 deletions

View File

@@ -1,9 +1,11 @@
package com.schisandra.oss.application.controller; package com.schisandra.oss.application.controller;
import cn.hutool.core.util.ZipUtil;
import cn.hutool.extra.spring.SpringUtil; import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.schisandra.oss.application.convert.SchisandraOssAliDTOConverter; import com.schisandra.oss.application.convert.SchisandraOssAliDTOConverter;
import com.schisandra.oss.application.convert.SchisandraOssMinioDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssAliDTO; import com.schisandra.oss.application.dto.SchisandraOssAliDTO;
import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.constant.OssConstant;
import com.schisandra.oss.application.oss.core.ali.AliOssClient; import com.schisandra.oss.application.oss.core.ali.AliOssClient;
@@ -11,23 +13,30 @@ import com.schisandra.oss.application.oss.core.ali.AliOssConfiguration;
import com.schisandra.oss.application.oss.model.OssInfo; import com.schisandra.oss.application.oss.model.OssInfo;
import com.schisandra.oss.common.entity.Result; import com.schisandra.oss.common.entity.Result;
import com.schisandra.oss.domain.bo.SchisandraOssAliBO; import com.schisandra.oss.domain.bo.SchisandraOssAliBO;
import com.schisandra.oss.domain.bo.SchisandraOssMinioBO;
import com.schisandra.oss.domain.redis.RedisUtil; import com.schisandra.oss.domain.redis.RedisUtil;
import com.schisandra.oss.domain.service.SchisandraOssAliDomainService; import com.schisandra.oss.domain.service.SchisandraOssAliDomainService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
@@ -50,37 +59,6 @@ public class SchisandraOssAliController {
@Resource @Resource
RedisUtil redisUtil; RedisUtil redisUtil;
/**
* @description: 预览文件
* @param: [userId, bucket, filePath]
* @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @date: 2024/6/27 10:14
*/
@PostMapping("previewFile")
public Result<String> previewMinioFile(@RequestParam String userId, @RequestParam String bucket, @RequestParam String filePath) throws IOException {
Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(filePath, "不能为空");
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId);
bean.getAliOssConfig().setBucketName(bucket);
try {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = dateFormat.format(date);
String key = redisUtil.buildKey(USER_OSS_PREFIX, "previewFile", formattedDate, userId, filePath);
HashMap<Object, Object> map = new HashMap<>();
String url = bean.getAliPreviewUrl(filePath);
map.put("url", url);
map.put("time", formattedDate);
redisUtil.setNx(key, map, 30L, TimeUnit.DAYS);
return Result.ok(url);
} catch (Exception e) {
return Result.fail(e.getMessage());
}
}
/** /**
* 返回ali表所有数据 * 返回ali表所有数据
* *
@@ -89,7 +67,7 @@ public class SchisandraOssAliController {
@GetMapping("returnAll") @GetMapping("returnAll")
public Result returnAll() { public Result returnAll() {
List<SchisandraOssAliBO> list = schisandraOssAliDomainService.selectAll(); List<SchisandraOssAliBO> list = schisandraOssAliDomainService.selectAll();
if (list.isEmpty()) { if(list.isEmpty()){
return Result.fail(); return Result.fail();
} }
return Result.ok(SchisandraOssAliDTOConverter.INSTANCE.convertBOToDTOList(list)); return Result.ok(SchisandraOssAliDTOConverter.INSTANCE.convertBOToDTOList(list));
@@ -97,7 +75,7 @@ public class SchisandraOssAliController {
@GetMapping("init") @GetMapping("init")
public Result init(@RequestParam String userId, @RequestParam String Id) { public Result init(@RequestParam String userId,@RequestParam String Id) {
if (log.isInfoEnabled()) { if (log.isInfoEnabled()) {
log.info("SchisandraOssAliController.init.userId:{}", userId); log.info("SchisandraOssAliController.init.userId:{}", userId);
} }
@@ -106,15 +84,15 @@ public class SchisandraOssAliController {
bo.setId(Long.valueOf(Id)); bo.setId(Long.valueOf(Id));
bo.setUserId(Long.valueOf(userId)); bo.setUserId(Long.valueOf(userId));
bo.setStatus(String.valueOf(true)); bo.setStatus(String.valueOf(true));
if (schisandraOssAliDomainService.update(bo)) { if(schisandraOssAliDomainService.update(bo)){
return aliOssConfiguration.aliOssClient(userId); return aliOssConfiguration.aliOssClient(userId);
} else { }else{
return Result.fail("初始化失败"); return Result.fail("初始化失败");
} }
} }
@PostMapping("shutdown") @PostMapping("shutdown")
public Result shutdownAli(@RequestParam String userId, @RequestParam String Id) { public Result shutdownAli(@RequestParam String userId,@RequestParam String Id){
if (log.isInfoEnabled()) { if (log.isInfoEnabled()) {
log.info("SchisandraOssAliController.shutdown.userId:{}", JSON.toJSONString(userId)); log.info("SchisandraOssAliController.shutdown.userId:{}", JSON.toJSONString(userId));
} }
@@ -122,10 +100,10 @@ public class SchisandraOssAliController {
bo.setId(Long.valueOf(Id)); bo.setId(Long.valueOf(Id));
bo.setUserId(Long.valueOf(userId)); bo.setUserId(Long.valueOf(userId));
bo.setStatus(String.valueOf(false)); bo.setStatus(String.valueOf(false));
if (schisandraOssAliDomainService.update(bo)) { if(schisandraOssAliDomainService.update(bo)){
SpringUtil.unregisterBean(OssConstant.OssType.ALI + userId); SpringUtil.unregisterBean(OssConstant.OssType.ALI+ userId);
return Result.ok("关闭成功"); return Result.ok("关闭成功");
} else { }else{
return Result.fail("关闭失败"); return Result.fail("关闭失败");
} }
} }
@@ -198,13 +176,13 @@ public class SchisandraOssAliController {
@GetMapping("listDir") @GetMapping("listDir")
public Result<String> listAliDir(@RequestParam String userId, @RequestParam String bucket, @RequestParam String prefix) throws Exception { public Result<String> listAliDir(@RequestParam String userId, @RequestParam String bucket, @RequestParam String prefix) throws Exception {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId); AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI+ userId);
bean.getAliOssConfig().setBucketName(bucket); bean.getAliOssConfig().setBucketName(bucket);
if (prefix == null) if (prefix == null)
prefix = ""; prefix = "";
if (bean.listAliInfo(bucket, prefix) != null) { if(bean.listAliInfo(bucket, prefix) != null){
return Result.ok(bean.listAliInfo(bucket, prefix)); return Result.ok(bean.listAliInfo(bucket, prefix));
} else { }else{
return Result.fail("获取文件目录信息失败"); return Result.fail("获取文件目录信息失败");
} }
@@ -219,10 +197,10 @@ public class SchisandraOssAliController {
@PostMapping("seleteBucket") @PostMapping("seleteBucket")
public Result seleteBucket(@RequestParam String userId) { public Result seleteBucket(@RequestParam String userId) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId); AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI+ userId);
if (bean.selectAllBucket() != null) { if(bean.selectAllBucket() != null){
return Result.ok(bean.selectAllBucket()); return Result.ok(bean.selectAllBucket());
} else { }else{
return Result.fail("查询失败"); return Result.fail("查询失败");
} }
@@ -239,11 +217,11 @@ public class SchisandraOssAliController {
public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket) { public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId); AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI+ userId);
bean.getAliOssConfig().setBucketName(bucket); bean.getAliOssConfig().setBucketName(bucket);
if (bean.createBucket(bucket).equals(bucket)) { if(bean.createBucket(bucket).equals(bucket)){
return Result.ok(bean.createBucket(bucket)); return Result.ok(bean.createBucket(bucket));
} else { }else{
return Result.fail("创建失败"); return Result.fail("创建失败");
} }
} }
@@ -261,9 +239,9 @@ public class SchisandraOssAliController {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId); AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId);
bean.getAliOssConfig().setBucketName(bucket); bean.getAliOssConfig().setBucketName(bucket);
if (bean.deleteBucket(bucket).equals("yes")) { if(bean.deleteBucket(bucket).equals("yes")){
return Result.ok(bean.deleteBucket(bucket)); return Result.ok(bean.deleteBucket(bucket));
} else { }else{
return Result.fail("删除失败,或许桶已经不存在"); return Result.fail("删除失败,或许桶已经不存在");
} }
} }
@@ -280,10 +258,7 @@ public class SchisandraOssAliController {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(fileName, "不能为空"); Preconditions.checkNotNull(fileName, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
// 获取文件输入流
InputStream is = file.getInputStream();
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId);
bean.getAliOssConfig().setBucketName(bucket);
//设置热力图 //设置热力图
Date date = new Date(); Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@@ -296,16 +271,20 @@ public class SchisandraOssAliController {
} else { } else {
redisUtil.set(key, String.valueOf(1)); redisUtil.set(key, String.valueOf(1));
} }
// 获取文件输入流
if (bean.upLoad(is, fileName, true) != null) { InputStream is = file.getInputStream();
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId);
bean.getAliOssConfig().setBucketName(bucket);
if(bean.upLoad(is, fileName, true) != null){
return Result.ok(bean.upLoad(is, fileName, true)); return Result.ok(bean.upLoad(is, fileName, true));
} else { }else{
return Result.fail(); return Result.fail();
} }
} }
/** /**
* @description: 下载文件 * @description: 下载文件
* @param: [schisandraOssAliDTO] * @param: [schisandraOssAliDTO]
@@ -313,18 +292,43 @@ public class SchisandraOssAliController {
* @date: 2024/6/26 13:56 * @date: 2024/6/26 13:56
*/ */
@GetMapping("downloadFile") @GetMapping("downloadFile")
public Result getAliFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam String filePath, HttpServletResponse response) throws Exception { public void getAliFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam List<String> filePath, HttpServletResponse response) throws Exception {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(filePath, "不能为空"); Preconditions.checkNotNull(filePath, "不能为空");
AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId); AliOssClient bean = SpringUtil.getBean(OssConstant.OssType.ALI + userId);
bean.getAliOssConfig().setBucketName(bucket); bean.getAliOssConfig().setBucketName(bucket);
ServletOutputStream output = response.getOutputStream(); ServletOutputStream output = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filePath.substring(filePath.lastIndexOf("/") + 1), "UTF-8")); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8"));
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
bean.downLoad(output, filePath); HashMap<String,InputStream> list=bean.downLoadMany(filePath);
return Result.ok(); String[] path = new String[list.size()];
InputStream[] inputStreams = new InputStream[list.size()];
path = list.keySet().toArray(path);
inputStreams = list.values().toArray(inputStreams);
//记录用户下载
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = dateFormat.format(date);
AtomicInteger count = new AtomicInteger(0);
InputStream[] inputStream2 = new InputStream[list.size()];
list.keySet().forEach( name -> {
try {
byte[] bytes = StreamUtils.copyToByteArray(list.get(name));
inputStream2[count.get()] = new ByteArrayInputStream(bytes);
String key = redisUtil.buildKey(USER_OSS_PREFIX, "download", formattedDate, userId, name);
HashMap<Object, Object> map = new HashMap<>();
map.put("size", bytes.length);
map.put("time",formattedDate);
redisUtil.setNx(key, map, 30L, TimeUnit.DAYS);
count.incrementAndGet();
} catch (IOException e) {
throw new RuntimeException(e);
}
});
ZipUtil.zip(output, path, inputStream2);
} }
/** /**

View File

@@ -9,6 +9,7 @@ import com.schisandra.oss.application.dto.SchisandraOssMinioDTO;
import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.constant.OssConstant;
import com.schisandra.oss.application.oss.core.minio.MinioOssClient; import com.schisandra.oss.application.oss.core.minio.MinioOssClient;
import com.schisandra.oss.application.oss.core.minio.MinioOssConfiguration; import com.schisandra.oss.application.oss.core.minio.MinioOssConfiguration;
import com.schisandra.oss.application.oss.model.OssInfo;
import com.schisandra.oss.common.entity.Result; import com.schisandra.oss.common.entity.Result;
import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; import com.schisandra.oss.domain.bo.SchisandraOssMinioBO;
import com.schisandra.oss.domain.redis.RedisUtil; import com.schisandra.oss.domain.redis.RedisUtil;
@@ -16,6 +17,7 @@ import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService;
import io.minio.errors.*; import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
@@ -25,12 +27,15 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -128,9 +133,9 @@ public class SchisandraOssMinioController {
* @author zlg * @author zlg
* @date: 2024/6/26 13:55 * @date: 2024/6/26 13:55
*/ */
@Cacheable(value = "MinioListDir", key = "#userId+#bucket+#dirName") @Cacheable(value = "MinioListDir", key = "#userId+#bucket+#dirName",unless = "#result == null")
@GetMapping("listDir") @GetMapping("listDir")
public Result<String> listMinioInfo(@RequestParam String userId, @RequestParam String dirName, @RequestParam String bucket) throws Exception { public Result listMinioInfo(@RequestParam String userId, @RequestParam String dirName, @RequestParam String bucket) throws Exception {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO + userId); MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO + userId);
bean.getMinioOssConfig().setBucketName(bucket); bean.getMinioOssConfig().setBucketName(bucket);
@@ -152,16 +157,14 @@ public class SchisandraOssMinioController {
MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO + userId); MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO + userId);
bean.getMinioOssConfig().setBucketName(bucket); bean.getMinioOssConfig().setBucketName(bucket);
HashMap<String, InputStream> list = bean.getTargetDir(listObjectsArgs); HashMap<String, InputStream> list = bean.getTargetDir(listObjectsArgs);
ServletOutputStream output = response.getOutputStream();
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8")); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8"));
response.setContentType("application/octet-stream"); response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
ServletOutputStream output = response.getOutputStream();
String[] path = new String[list.size()]; String[] path = new String[list.size()];
InputStream[] inputStreams = new InputStream[list.size()]; InputStream[] inputStreams = new InputStream[list.size()];
path = list.keySet().toArray(path); path = list.keySet().toArray(path);
inputStreams = list.values().toArray(inputStreams); inputStreams = list.values().toArray(inputStreams);
//记录用户下载 //记录用户下载
Date date = new Date(); Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@@ -169,6 +172,7 @@ public class SchisandraOssMinioController {
list.keySet().forEach(name -> { list.keySet().forEach(name -> {
try { try {
byte[] bytes = StreamUtils.copyToByteArray(list.get(name)); byte[] bytes = StreamUtils.copyToByteArray(list.get(name));
list.get(name).reset();
String key = redisUtil.buildKey(USER_OSS_PREFIX, "download", formattedDate, userId, name); String key = redisUtil.buildKey(USER_OSS_PREFIX, "download", formattedDate, userId, name);
HashMap<Object, Object> map = new HashMap<>(); HashMap<Object, Object> map = new HashMap<>();
map.put("size", bytes.length); map.put("size", bytes.length);
@@ -177,7 +181,6 @@ public class SchisandraOssMinioController {
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
}); });
ZipUtil.zip(output, path, inputStreams); ZipUtil.zip(output, path, inputStreams);
} }
@@ -189,7 +192,7 @@ public class SchisandraOssMinioController {
* @author zlg * @author zlg
* @date: 2024/6/26 14:34 * @date: 2024/6/26 14:34
*/ */
@CacheEvict(value = "MinioListDir", key = "#userId+#bucket+#dirName") @CacheEvict(value = "MinioListDir", key = "#userId+#bucket+#filePath")
@PostMapping("deleteFile") @PostMapping("deleteFile")
public Result deleteMinioFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam String filePath) { public Result deleteMinioFile(@RequestParam String bucket, @RequestParam String userId, @RequestParam String filePath) {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
@@ -345,12 +348,20 @@ public class SchisandraOssMinioController {
* @author zlg * @author zlg
* @date: 2024/6/26 17:37 * @date: 2024/6/26 17:37
*/ */
@Cacheable(value = "minioBucket", key = "#userId",unless = "#result==null")
@PostMapping("seleteBucket") @PostMapping("seleteBucket")
public Result<String> seleteBucket(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { public Result<String> seleteBucket(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO + userId); MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO + userId);
return Result.ok(bean.selectAllBucket()); return Result.ok(bean.selectAllBucket());
} }
@Cacheable(value = "minioBucket", key = "#userId+#bucket",unless = "#result==null")
@PostMapping("getBucketSize")
public Result<String> getBucketSize(@RequestParam String userId, @RequestParam String bucket) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
Preconditions.checkNotNull(userId, "不能为空");
MinioOssClient bean = SpringUtil.getBean(OssConstant.OssType.MINIO+userId);
return Result.ok(bean.getMinioBucketSize(bucket));
}
/** /**
* @description: 创建bucket * @description: 创建bucket
@@ -359,6 +370,7 @@ public class SchisandraOssMinioController {
* @author zlg * @author zlg
* @date: 2024/6/26 17:38 * @date: 2024/6/26 17:38
*/ */
@CacheEvict(value = "minioBucket", key = "#userId")
@PostMapping("createBucket") @PostMapping("createBucket")
public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket) { public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
@@ -375,6 +387,7 @@ public class SchisandraOssMinioController {
* @author zlg * @author zlg
* @date: 2024/6/26 17:38 * @date: 2024/6/26 17:38
*/ */
@CacheEvict(value = "minioBucket", key = "#userId")
@PostMapping("deleteBucket") @PostMapping("deleteBucket")
public Result<String> deleteBucket(@RequestParam String userId, @RequestParam String bucket) { public Result<String> deleteBucket(@RequestParam String userId, @RequestParam String bucket) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");

View File

@@ -24,6 +24,9 @@ import com.schisandra.oss.domain.redis.RedisUtil;
import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService; import com.schisandra.oss.domain.service.SchisandraOssTencentDomainService;
import io.minio.errors.*; import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -47,22 +50,23 @@ import java.util.List;
@Slf4j @Slf4j
public class SchisandraOssTencentController { public class SchisandraOssTencentController {
@Resource
private SchisandraOssTencentDomainService schisandraOssTencentDomainService;
@Resource
TencentOssConfiguration tencentOssConfiguration;
private final String USER_OSS_PREFIX = "oss:user:heat"; private final String USER_OSS_PREFIX = "oss:user:heat";
@Resource @Resource
TencentOssConfiguration tencentOssConfiguration;
@Resource
RedisUtil redisUtil; RedisUtil redisUtil;
@Resource
private SchisandraOssTencentDomainService schisandraOssTencentDomainService;
/** /**
* 返回tencent表所有数据 * 返回tencent表所有数据
*
* @return * @return
*/ */
@GetMapping("returnAll") @GetMapping("returnAll")
public Result returnAll() { public Result returnAll() {
List<SchisandraOssTencentBO> list = schisandraOssTencentDomainService.selectAll(); List<SchisandraOssTencentBO> list = schisandraOssTencentDomainService.selectAll();
if(list.isEmpty()){ if (list.isEmpty()) {
return Result.fail(); return Result.fail();
} }
return Result.ok(SchisandraOssTencentDTOConverter.INSTANCE.convertBOToDTOList(list)); return Result.ok(SchisandraOssTencentDTOConverter.INSTANCE.convertBOToDTOList(list));
@@ -70,7 +74,7 @@ public class SchisandraOssTencentController {
@PostMapping("init") @PostMapping("init")
public Result initTencent(@RequestParam String userId,@RequestParam String Id){ public Result initTencent(@RequestParam String userId, @RequestParam String Id) {
if (log.isInfoEnabled()) { if (log.isInfoEnabled()) {
log.info("SchisandraOssTencentController.init.userId:{}", userId); log.info("SchisandraOssTencentController.init.userId:{}", userId);
} }
@@ -79,15 +83,15 @@ public class SchisandraOssTencentController {
bo.setId(Long.valueOf(Id)); bo.setId(Long.valueOf(Id));
bo.setUserId(Long.valueOf(userId)); bo.setUserId(Long.valueOf(userId));
bo.setStatus(String.valueOf(true)); bo.setStatus(String.valueOf(true));
if(schisandraOssTencentDomainService.update(bo)){ if (schisandraOssTencentDomainService.update(bo)) {
return tencentOssConfiguration.tencentOssClient(userId); return tencentOssConfiguration.tencentOssClient(userId);
}else{ } else {
return Result.fail("初始化失败"); return Result.fail("初始化失败");
} }
} }
@PostMapping("shutdown") @PostMapping("shutdown")
public Result shutdownTencent(@RequestParam String userId,@RequestParam String Id){ public Result shutdownTencent(@RequestParam String userId, @RequestParam String Id) {
if (log.isInfoEnabled()) { if (log.isInfoEnabled()) {
log.info("SchisandraOssTencentController.shutdown.userId:{}", JSON.toJSONString(userId)); log.info("SchisandraOssTencentController.shutdown.userId:{}", JSON.toJSONString(userId));
} }
@@ -95,10 +99,10 @@ public class SchisandraOssTencentController {
bo.setId(Long.valueOf(Id)); bo.setId(Long.valueOf(Id));
bo.setUserId(Long.valueOf(userId)); bo.setUserId(Long.valueOf(userId));
bo.setStatus(String.valueOf(false)); bo.setStatus(String.valueOf(false));
if(schisandraOssTencentDomainService.update(bo)){ if (schisandraOssTencentDomainService.update(bo)) {
SpringUtil.unregisterBean(OssConstant.OssType.TENCENT+ userId); SpringUtil.unregisterBean(OssConstant.OssType.TENCENT + userId);
return Result.ok("关闭成功"); return Result.ok("关闭成功");
}else{ } else {
return Result.fail("关闭失败"); return Result.fail("关闭失败");
} }
} }
@@ -110,12 +114,23 @@ public class SchisandraOssTencentController {
* @author zlg * @author zlg
* @date: 2024/6/29 13:28 * @date: 2024/6/29 13:28
*/ */
@Cacheable(value = "TencentBucket", key = "#userId")
@PostMapping("seleteBucket") @PostMapping("seleteBucket")
public Result<String> seleteBucket(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { public Result<String> seleteBucket(@RequestParam String userId) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
return Result.ok(bean.selectAllBucket()); return Result.ok(bean.selectAllBucket());
} }
@Cacheable(value = "TencentBucket", key = "#userId+#bucket")
@PostMapping("getBucketSize")
public Result<String> getBucketSize(@RequestParam String userId, @RequestParam String bucket) throws Exception {
Preconditions.checkNotNull(bucket, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
bean.getTencentOssConfig().setBucketName(bucket);
return Result.ok(bean.getTencentBucketSize(bucket));
}
/** /**
* @description: 查询指定目录 * @description: 查询指定目录
* @param: [userId, dirName, bucket] * @param: [userId, dirName, bucket]
@@ -123,62 +138,69 @@ public class SchisandraOssTencentController {
* @author zlg * @author zlg
* @date: 2024/6/29 13:28 * @date: 2024/6/29 13:28
*/ */
@Cacheable(value = "TencentBucketDir", key = "#userId+#bucket+#dirName")
@GetMapping("listDir") @GetMapping("listDir")
public Result<String> listTencentInfo(@RequestParam String userId, @RequestParam String dirName,@RequestParam String bucket) throws Exception { public Result<String> listTencentInfo(@RequestParam String userId, @RequestParam String dirName, @RequestParam String bucket) throws Exception {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
bean.getTencentOssConfig().setBucketName(bucket); bean.getTencentOssConfig().setBucketName(bucket);
return Result.ok(bean.listTargetDir(bucket, dirName)); return Result.ok(bean.listTargetDir(bucket, dirName));
} }
/**
* @description: 创建桶 /**
* @param: [userId, bucket, appId] * @description: 创建桶
* @return: com.schisandra.oss.common.entity.Result<java.lang.String> * @param: [userId, bucket, appId]
* @author zlg * @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @date: 2024/6/29 13:27 * @author zlg
*/ * @date: 2024/6/29 13:27
*/
@CacheEvict(value = "TencentBucket", key = "#userId")
@PostMapping("createBucket") @PostMapping("createBucket")
public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket,@RequestParam String appId) { public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket, @RequestParam String appId) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
// bean.getTencentOssConfig().setBucketName(bucket); // bean.getTencentOssConfig().setBucketName(bucket);
return Result.ok(bean.createBuctet(bucket,appId)); return Result.ok(bean.createBuctet(bucket, appId));
} }
/**
* @description: 删除腾讯云对象存储bucket /**
* @param: [userId, bucket, appId] * @description: 删除腾讯云对象存储bucket
* @return: com.schisandra.oss.common.entity.Result<java.lang.String> * @param: [userId, bucket, appId]
* @author zlg * @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @date: 2024/6/29 13:27 * @author zlg
*/ * @date: 2024/6/29 13:27
*/
@CacheEvict(value = "TencentBucket", key = "#userId")
@PostMapping("deleteBucket") @PostMapping("deleteBucket")
public Result<String> deleteBucket(@RequestParam String userId, @RequestParam String bucket,@RequestParam String appId) { public Result<String> deleteBucket(@RequestParam String userId, @RequestParam String bucket, @RequestParam String appId) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
// bean.getTencentOssConfig().setBucketName(bucket); // bean.getTencentOssConfig().setBucketName(bucket);
if (bean.deleteBucket(bucket,appId)){ if (bean.deleteBucket(bucket, appId)) {
return Result.ok(); return Result.ok();
}else { } else {
return Result.fail(); return Result.fail();
} }
} }
/**
* @description: 分享腾讯云对象存储链接 /**
* @param: [userId, bucket, target] * @description: 分享腾讯云对象存储链接
* @return: com.schisandra.oss.common.entity.Result<java.lang.String> * @param: [userId, bucket, target]
* @author zlg * @return: com.schisandra.oss.common.entity.Result<java.lang.String>
* @date: 2024/6/29 13:27 * @author zlg
*/ * @date: 2024/6/29 13:27
*/
@GetMapping("shareUrl") @GetMapping("shareUrl")
public Result<String> shareTencentUrl(@RequestParam String userId, @RequestParam String bucket,@RequestParam String target) { public Result<String> shareTencentUrl(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
return Result.ok(bean.shareTencentObject(bucket,target)); return Result.ok(bean.shareTencentObject(bucket, target));
} }
/** /**
* @description: 腾讯云对象存储上传文件 * @description: 腾讯云对象存储上传文件
* @param: [userId, bucket, target, file] * @param: [userId, bucket, target, file]
@@ -190,26 +212,27 @@ public class SchisandraOssTencentController {
public Result<String> uploadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target, @RequestParam MultipartFile file) throws IOException { public Result<String> uploadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target, @RequestParam MultipartFile file) throws IOException {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
if (!target.isEmpty()){ if (!target.isEmpty()) {
target=target+"/"+file.getOriginalFilename(); target = target + "/" + file.getOriginalFilename();
} }
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
InputStream is = file.getInputStream(); InputStream is = file.getInputStream();
bean.getTencentOssConfig().setBucketName(bucket); bean.getTencentOssConfig().setBucketName(bucket);
//设置热力图 //设置热力图
Date date =new Date(); Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = dateFormat.format(date); String formattedDate = dateFormat.format(date);
String key = redisUtil.buildKey(USER_OSS_PREFIX+":"+userId,formattedDate); String key = redisUtil.buildKey(USER_OSS_PREFIX + ":" + userId, formattedDate);
int count=1; int count = 1;
if (redisUtil.exist(key)){ if (redisUtil.exist(key)) {
count= Integer.parseInt(redisUtil.get(key)); count = Integer.parseInt(redisUtil.get(key));
redisUtil.set(key, String.valueOf(count+1)); redisUtil.set(key, String.valueOf(count + 1));
}else { } else {
redisUtil.set(key, String.valueOf(1)); redisUtil.set(key, String.valueOf(1));
} }
return Result.ok(bean.upLoadParts(is,target,file.getOriginalFilename())); return Result.ok(bean.upLoadParts(is, target, file.getOriginalFilename()));
} }
/** /**
* @description: 腾讯云对象存储下载文件 * @description: 腾讯云对象存储下载文件
* @param: [userId, bucket, target] * @param: [userId, bucket, target]
@@ -221,9 +244,10 @@ public class SchisandraOssTencentController {
public Result<String> downloadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target) { public Result<String> downloadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
return Result.ok(bean.downloadTencent(bucket,target)); return Result.ok(bean.downloadTencent(bucket, target));
} }
/** /**
* @description: 腾讯云对象存储移动文件 * @description: 腾讯云对象存储移动文件
* @param: [userId, sourceBucket, targetBucket, targetName, SourceName] * @param: [userId, sourceBucket, targetBucket, targetName, SourceName]
@@ -231,16 +255,18 @@ public class SchisandraOssTencentController {
* @author zlg * @author zlg
* @date: 2024/7/1 16:02 * @date: 2024/7/1 16:02
*/ */
@Caching(cacheable = @Cacheable(value = "TencentBucketDir", key = "#userId+#targetBucket+#targetName"), evict = @CacheEvict(value = "MinioListDir", key = "#userId+#sourceBucket+#SourceName"))
@PostMapping("moveFile") @PostMapping("moveFile")
public Result<String> moveTencent(@RequestParam String userId, @RequestParam String sourceBucket, @RequestParam String targetBucket, @RequestParam String targetName,@RequestParam String SourceName) throws IOException { public Result<String> moveTencent(@RequestParam String userId, @RequestParam String sourceBucket, @RequestParam String targetBucket, @RequestParam String targetName, @RequestParam String SourceName) throws IOException {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
CopyResult copyResult = bean.moveTencent(SourceName, targetName, sourceBucket, targetBucket); CopyResult copyResult = bean.moveTencent(SourceName, targetName, sourceBucket, targetBucket);
if (copyResult==null){ if (copyResult == null) {
return Result.fail(); return Result.fail();
} }
return Result.ok(copyResult); return Result.ok(copyResult);
} }
/** /**
* @description: 腾讯云对象存储复制文件 * @description: 腾讯云对象存储复制文件
* @param: [userId, sourceBucket, targetBucket, targetName, SourceName] * @param: [userId, sourceBucket, targetBucket, targetName, SourceName]
@@ -248,16 +274,18 @@ public class SchisandraOssTencentController {
* @author zlg * @author zlg
* @date: 2024/7/1 16:02 * @date: 2024/7/1 16:02
*/ */
@Cacheable(value = "TencentBucketDir", key = "#userId+#targetBucket+#targetName")
@PostMapping("copyFile") @PostMapping("copyFile")
public Result<String> copyTencent(@RequestParam String userId, @RequestParam String sourceBucket, @RequestParam String targetBucket, @RequestParam String targetName,@RequestParam String SourceName) throws IOException { public Result<String> copyTencent(@RequestParam String userId, @RequestParam String sourceBucket, @RequestParam String targetBucket, @RequestParam String targetName, @RequestParam String SourceName) throws IOException {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
CopyResult copyResult = bean.copyTencent(SourceName,targetName , sourceBucket, targetBucket); CopyResult copyResult = bean.copyTencent(SourceName, targetName, sourceBucket, targetBucket);
if (copyResult==null){ if (copyResult == null) {
return Result.fail(); return Result.fail();
} }
return Result.ok(copyResult); return Result.ok(copyResult);
} }
/** /**
* @description: 腾讯云对象存储删除文件 * @description: 腾讯云对象存储删除文件
* @param: [userId, bucketName, target] * @param: [userId, bucketName, target]
@@ -265,12 +293,13 @@ public class SchisandraOssTencentController {
* @author zlg * @author zlg
* @date: 2024/7/1 16:02 * @date: 2024/7/1 16:02
*/ */
@Cacheable()
@PostMapping("deleteFile") @PostMapping("deleteFile")
public Result<String> deleteTencent(@RequestParam String userId, @RequestParam String bucketName, @RequestParam List<DeleteObjectsRequest.KeyVersion> target) throws IOException { public Result<String> deleteTencent(@RequestParam String userId, @RequestParam String bucketName, @RequestParam List<DeleteObjectsRequest.KeyVersion> target) throws IOException {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT+ userId); TencentOssClient bean = SpringUtil.getBean(OssConstant.OssType.TENCENT + userId);
DeleteObjectsResult deleteResult = bean.deleteTencent(bucketName, target); DeleteObjectsResult deleteResult = bean.deleteTencent(bucketName, target);
if (deleteResult==null){ if (deleteResult == null) {
return Result.fail(); return Result.fail();
} }
return Result.ok(deleteResult); return Result.ok(deleteResult);

View File

@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.file.FileNameUtil; import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.io.unit.DataSizeUtil; import cn.hutool.core.io.unit.DataSizeUtil;
import cn.hutool.core.lang.hash.Hash;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@@ -13,6 +14,11 @@ import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.HttpHeaders; import com.aliyun.oss.common.utils.HttpHeaders;
import com.aliyun.oss.model.*; import com.aliyun.oss.model.*;
import com.jd.platform.async.executor.Async;
import com.jd.platform.async.worker.WorkResult;
import com.jd.platform.async.wrapper.WorkerWrapper;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.model.FileInfo;
import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.constant.OssConstant;
import com.schisandra.oss.application.oss.core.StandardOssClient; import com.schisandra.oss.application.oss.core.StandardOssClient;
import com.schisandra.oss.application.oss.core.ali.model.AliOssConfig; import com.schisandra.oss.application.oss.core.ali.model.AliOssConfig;
@@ -22,6 +28,7 @@ import com.schisandra.oss.application.oss.model.FileOssInfo;
import com.schisandra.oss.application.oss.model.OssInfo; import com.schisandra.oss.application.oss.model.OssInfo;
import com.schisandra.oss.application.oss.model.SliceConfig; import com.schisandra.oss.application.oss.model.SliceConfig;
import com.schisandra.oss.application.oss.utils.OssPathUtil; import com.schisandra.oss.application.oss.utils.OssPathUtil;
import io.minio.ListObjectsArgs;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -29,12 +36,16 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URL;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* https://help.aliyun.com/product/31815.html * https://help.aliyun.com/product/31815.html
@@ -55,29 +66,23 @@ public class AliOssClient implements StandardOssClient {
private OSS oss; private OSS oss;
private AliOssConfig aliOssConfig; private AliOssConfig aliOssConfig;
public String getAliPreviewUrl(String fileName) {
URL presignedUrl = oss.generatePresignedUrl(getBucketName(), fileName, new Date());
return String.valueOf(presignedUrl);
}
public String getAliBucketSize(String bucket) { public String getAliBucketSize(String bucket) {
ObjectListing objectListing = oss.listObjects(bucket, ""); ObjectListing objectListing = oss.listObjects(bucket, "");
long x = 0L; long x = 0L;
List<OSSObjectSummary> sums = objectListing.getObjectSummaries(); List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
for (OSSObjectSummary objectSummary : sums) { for(OSSObjectSummary objectSummary : sums){
x += objectSummary.getSize(); x+=objectSummary.getSize();
} }
return DataSizeUtil.format(x); return DataSizeUtil.format(x);
} }
public List<HashMap<String, String>> selectAllBucket() { public List<HashMap<String,String>> selectAllBucket() {
List<Bucket> buckets = oss.listBuckets(); List<Bucket> buckets = oss.listBuckets();
List<HashMap<String, String>> list1 = new ArrayList<>(); List<HashMap<String,String>> list1 = new ArrayList<>();
buckets.forEach(bucket -> { buckets.forEach(bucket -> {
HashMap<String, String> names = new HashMap<>(); HashMap<String, String> names = new HashMap<>();
names.put("name", bucket.getName()); names.put("name",bucket.getName());
names.put("size", getAliBucketSize(bucket.getName())); names.put("size",getAliBucketSize(bucket.getName()));
list1.add(names); list1.add(names);
}); });
return list1; return list1;
@@ -89,12 +94,12 @@ public class AliOssClient implements StandardOssClient {
* @return: java.util.List<com.schisandra.oss.application.oss.model.OssInfo> * @return: java.util.List<com.schisandra.oss.application.oss.model.OssInfo>
* @date: 2024/7/5 13:34 * @date: 2024/7/5 13:34
*/ */
public String transfer(String before) { public String transfer(String before){
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
Date date = new Date(); Date date = new Date();
try { try{
date = sdf.parse(before); date = sdf.parse(before);
} catch (Exception e) { }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
String formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); String formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
@@ -102,23 +107,23 @@ public class AliOssClient implements StandardOssClient {
return formatStr; return formatStr;
} }
public List<OssInfo> listAliInfo(String bucket, String prefix) { public List<OssInfo> listAliInfo(String bucket, String prefix){
// 列举文件。如果不设置Prefix则列举存储空间下的所有文件。如果设置Prefix则列举包含指定前缀的文件。 // 列举文件。如果不设置Prefix则列举存储空间下的所有文件。如果设置Prefix则列举包含指定前缀的文件。
ObjectListing objectListing = oss.listObjects(bucket, prefix); ObjectListing objectListing = oss.listObjects(bucket, prefix);
List<OSSObjectSummary> sums = objectListing.getObjectSummaries(); List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
List<OssInfo> infos = new ArrayList<>(); List<OssInfo> infos = new ArrayList<>();
if (prefix == "") { if(prefix == ""){
for (OSSObjectSummary objectSummary : sums) { for(OSSObjectSummary objectSummary : sums){
OssInfo info = new OssInfo(); OssInfo info = new OssInfo();
String[] split_path = objectSummary.getKey().split("/"); String[] split_path = objectSummary.getKey().split("/");
if (split_path.length >= 2) if(split_path.length>=2)
continue; continue;
String[] split_path_again = split_path[0].split("\\."); String[] split_path_again = split_path[0].split("\\.");
if (split_path_again.length >= 2) { if(split_path_again.length>=2) {
info.setIsDir(false); info.setIsDir(false);
} else { }else{
info.setIsDir(true); info.setIsDir(true);
} }
info.setName(split_path[0]); info.setName(split_path[0]);
@@ -130,21 +135,21 @@ public class AliOssClient implements StandardOssClient {
infos.add(info); infos.add(info);
} }
} else { }else{
for (OSSObjectSummary objectSummary : sums) { for(OSSObjectSummary objectSummary : sums){
OssInfo info = new OssInfo(); OssInfo info = new OssInfo();
int x = prefix.split("/").length; int x = prefix.split("/").length;
String[] split_path = objectSummary.getKey().split("/"); String[] split_path = objectSummary.getKey().split("/");
if (split_path.length >= x + 2) if(split_path.length>=x+2)
continue; continue;
String[] split_path_again = split_path[split_path.length - 1].split("\\."); String[] split_path_again = split_path[split_path.length-1].split("\\.");
if (split_path_again.length >= 2) { if(split_path_again.length>=2){
info.setIsDir(false); info.setIsDir(false);
} else { }else{
info.setIsDir(true); info.setIsDir(true);
} }
info.setName(split_path[split_path.length - 1]); info.setName(split_path[split_path.length-1]);
info.setPath(objectSummary.getKey()); info.setPath(objectSummary.getKey());
info.setLength(DataSizeUtil.format(objectSummary.getSize())); info.setLength(DataSizeUtil.format(objectSummary.getSize()));
@@ -163,7 +168,7 @@ public class AliOssClient implements StandardOssClient {
if (!oss.doesBucketExist(bucketName)) { if (!oss.doesBucketExist(bucketName)) {
Bucket bucket = oss.createBucket(bucketName); Bucket bucket = oss.createBucket(bucketName);
bucket.setRegion("chengdu"); bucket.setRegion("chengdu");
} else { }else {
return "bucket already exists"; return "bucket already exists";
} }
} catch (Exception e) { } catch (Exception e) {
@@ -173,13 +178,14 @@ public class AliOssClient implements StandardOssClient {
} }
public String deleteBucket(String bucketName) { public String deleteBucket(String bucketName) {
try { try{
if (oss.doesBucketExist(bucketName)) { if (oss.doesBucketExist(bucketName)){
VoidResult voidResult = oss.deleteBucket(bucketName); VoidResult voidResult = oss.deleteBucket(bucketName);
} else { }
else{
return "bucket does not exist"; return "bucket does not exist";
} }
} catch (Exception e) { }catch(Exception e){
e.printStackTrace(); e.printStackTrace();
} }
return "yes"; return "yes";
@@ -228,9 +234,40 @@ public class AliOssClient implements StandardOssClient {
} }
return getInfo(targetName); return getInfo(targetName);
} }
public HashMap<String,InputStream> downLoadMany(List<String> listObjectsArgs) throws ExecutionException, InterruptedException {
HashMap<String,InputStream> list = new HashMap<>();
List<WorkerWrapper> wrappers=new ArrayList<>();
listObjectsArgs.forEach(args -> {
String bucketName = getBucketName();
String key = getKey(args, false);
ObjectListing objectListing=oss .listObjects(bucketName,args);
List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
sums.forEach(r -> {
try {
WorkerWrapper wrapper1 = new WorkerWrapper.Builder<String, InputStream>().worker((String dirName, Map<String, WorkerWrapper> allWrappers) -> {
try {
list.put(dirName,oss.getObject(bucketName, r.getKey()).getObjectContent());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}).param(r.getKey().toString()).id(r.getETag()).callback((boolean success, String param, WorkResult<InputStream> re)->{
}).build();
wrappers.add(wrapper1);
} catch (Exception e) {
e.printStackTrace();
}
});
});
Async.beginWork(3500L,new ThreadPoolExecutor(10, 100, 5L,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()), wrappers);
return list;
}
@Override @Override
public void downLoad(OutputStream os, String targetName) { public void downLoad(OutputStream os, String targetName) {
String bucketName = getBucketName(); String bucketName = getBucketName();
String key = getKey(targetName, false); String key = getKey(targetName, false);
OSSObject ossObject = oss.getObject(bucketName, key); OSSObject ossObject = oss.getObject(bucketName, key);