fix: 多线程下载

This commit is contained in:
zlg
2024-07-16 18:54:01 +08:00
parent 29e17a2629
commit a3a11880f7
12 changed files with 233 additions and 88 deletions

View File

@@ -1,10 +1,10 @@
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.SchisandraOssQiniuDTOConverter; import com.schisandra.oss.application.convert.SchisandraOssQiniuDTOConverter;
import com.schisandra.oss.application.convert.SchisandraOssSftpDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssQiniuDTO; import com.schisandra.oss.application.dto.SchisandraOssQiniuDTO;
import com.schisandra.oss.application.oss.constant.OssConstant; import com.schisandra.oss.application.oss.constant.OssConstant;
import com.schisandra.oss.application.oss.core.qiniu.QiNiuOssClient; import com.schisandra.oss.application.oss.core.qiniu.QiNiuOssClient;
@@ -12,25 +12,28 @@ import com.schisandra.oss.application.oss.core.qiniu.QiNiuOssConfiguration;
import com.schisandra.oss.application.oss.exception.OssException; import com.schisandra.oss.application.oss.exception.OssException;
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.SchisandraOssMinioBO;
import com.schisandra.oss.domain.bo.SchisandraOssQiniuBO; import com.schisandra.oss.domain.bo.SchisandraOssQiniuBO;
import com.schisandra.oss.domain.bo.SchisandraOssSftpBO;
import com.schisandra.oss.domain.redis.RedisUtil; import com.schisandra.oss.domain.redis.RedisUtil;
import com.schisandra.oss.domain.service.SchisandraOssQiniuDomainService; import com.schisandra.oss.domain.service.SchisandraOssQiniuDomainService;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
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.net.URLEncoder; import java.net.URLEncoder;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* 七牛云对象存储配置表 controller * 七牛云对象存储配置表 controller
@@ -43,15 +46,14 @@ import java.util.List;
@Slf4j @Slf4j
public class SchisandraOssQiniuController { public class SchisandraOssQiniuController {
private final String USER_OSS_PREFIX = "oss:user:heat";
@Resource
RedisUtil redisUtil;
@Resource @Resource
private SchisandraOssQiniuDomainService schisandraOssQiniuDomainService; private SchisandraOssQiniuDomainService schisandraOssQiniuDomainService;
@Resource @Resource
private QiNiuOssConfiguration qiNiuOssConfiguration; private QiNiuOssConfiguration qiNiuOssConfiguration;
private final String USER_OSS_PREFIX = "oss:user:heat";
@Resource
RedisUtil redisUtil;
/** /**
* 返回七牛表所有数据 * 返回七牛表所有数据
* *
@@ -60,7 +62,7 @@ public class SchisandraOssQiniuController {
@GetMapping("returnAll") @GetMapping("returnAll")
public Result returnAll() { public Result returnAll() {
List<SchisandraOssQiniuBO> list = schisandraOssQiniuDomainService.selectAll(); List<SchisandraOssQiniuBO> list = schisandraOssQiniuDomainService.selectAll();
if(list.isEmpty()){ if (list.isEmpty()) {
return Result.fail(); return Result.fail();
} }
return Result.ok(SchisandraOssQiniuDTOConverter.INSTANCE.convertBOToDTOList(list)); return Result.ok(SchisandraOssQiniuDTOConverter.INSTANCE.convertBOToDTOList(list));
@@ -75,11 +77,11 @@ public class SchisandraOssQiniuController {
@GetMapping("listDir") @GetMapping("listDir")
public Result<String> listQiniuInfo(@RequestParam String userId, @RequestParam String prefix, @RequestParam String bucket) throws Exception { public Result<String> listQiniuInfo(@RequestParam String userId, @RequestParam String prefix, @RequestParam String bucket) throws Exception {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
if(bean.listfile(bucket, prefix).isEmpty()){ if (bean.listfile(bucket, prefix).isEmpty()) {
return Result.fail(); return Result.fail();
}else{ } else {
return Result.ok(bean.listfile(bucket, prefix)); return Result.ok(bean.listfile(bucket, prefix));
} }
@@ -98,7 +100,7 @@ public class SchisandraOssQiniuController {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(oldFileName, "不能为空"); Preconditions.checkNotNull(oldFileName, "不能为空");
Preconditions.checkNotNull(newFileName, "不能为空"); Preconditions.checkNotNull(newFileName, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
try { try {
bean.rename(oldFileName, newFileName); bean.rename(oldFileName, newFileName);
@@ -122,7 +124,7 @@ public class SchisandraOssQiniuController {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(oldFilePath, "不能为空"); Preconditions.checkNotNull(oldFilePath, "不能为空");
Preconditions.checkNotNull(newFilePath, "不能为空"); Preconditions.checkNotNull(newFilePath, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
try { try {
bean.copy(oldFilePath, newFilePath); bean.copy(oldFilePath, newFilePath);
@@ -141,16 +143,45 @@ public class SchisandraOssQiniuController {
* @date: 2024/7/8 13:56 * @date: 2024/7/8 13:56
*/ */
@GetMapping("downloadFile") @GetMapping("downloadFile")
public void download_open(@RequestParam String userId, @RequestParam String endpoint, @RequestParam String filename, HttpServletResponse response) throws IOException { public Result download_open(@RequestParam String userId, @RequestParam String bucket, @RequestParam List<String> listObjectsArgs, HttpServletResponse response) throws IOException {
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setEndpoint(endpoint);
ServletOutputStream output = response.getOutputStream(); ServletOutputStream output = response.getOutputStream();
SchisandraOssQiniuBO schisandraOssQiniuBO = schisandraOssQiniuDomainService.getEndpointByuserIdAndBucket(Long.valueOf(userId), bucket);
if (schisandraOssQiniuBO.getEndpoint() == null) {
return Result.fail("请配置该存储桶的相关配置endpoint");
}
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel"); try {
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8")); HashMap<String, InputStream> list = bean.downLoadMany(listObjectsArgs, schisandraOssQiniuBO.getEndpoint());
bean.downLoad_open(output, filename, endpoint); String[] path = new String[list.size()];
path = list.keySet().toArray(path);
//记录用户下载
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);
} catch (Exception e) {
return Result.fail();
}
return Result.ok();
} }
@@ -165,12 +196,12 @@ public class SchisandraOssQiniuController {
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(filePath, "不能为空"); Preconditions.checkNotNull(filePath, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
try{ try {
bean.delete(filePath); bean.delete(filePath);
return Result.ok(); return Result.ok();
}catch(OssException e){ } catch (OssException e) {
return Result.fail(); return Result.fail();
} }
} }
@@ -203,9 +234,9 @@ public class SchisandraOssQiniuController {
// 获取文件输入流 // 获取文件输入流
InputStream is = file.getInputStream(); InputStream is = file.getInputStream();
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
if(bean.upLoad(is, fileName, true) != null){ if (bean.upLoad(is, fileName, true) != null) {
return Result.ok(bean.upLoad(is, fileName, true)); return Result.ok(bean.upLoad(is, fileName, true));
} }
return Result.fail(); return Result.fail();
@@ -222,11 +253,10 @@ public class SchisandraOssQiniuController {
@PostMapping("seleteBucket") @PostMapping("seleteBucket")
public Result seleteBucket(@RequestParam String userId) { public Result seleteBucket(@RequestParam String userId) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
if(bean.selectAllBucket().isEmpty()){ if (bean.selectAllBucket().isEmpty()) {
return Result.fail(); return Result.fail();
} } else
else
return Result.ok(bean.selectAllBucket()); return Result.ok(bean.selectAllBucket());
} }
@@ -240,11 +270,11 @@ public class SchisandraOssQiniuController {
public Result deleteBucket(@RequestParam String userId, @RequestParam String bucket) { public Result deleteBucket(@RequestParam String userId, @RequestParam String bucket) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
if(bean.deleteBucket(bucket) == 1){ if (bean.deleteBucket(bucket) == 1) {
return Result.ok(); return Result.ok();
}else } else
return Result.fail("删除桶失败"); return Result.fail("删除桶失败");
} }
@@ -261,16 +291,15 @@ public class SchisandraOssQiniuController {
public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket, @RequestParam String region) { public Result<String> createBucket(@RequestParam String userId, @RequestParam String bucket, @RequestParam String region) {
Preconditions.checkNotNull(userId, "不能为空"); Preconditions.checkNotNull(userId, "不能为空");
Preconditions.checkNotNull(bucket, "不能为空"); Preconditions.checkNotNull(bucket, "不能为空");
QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU+ userId); QiNiuOssClient bean = SpringUtil.getBean(OssConstant.OssType.QINIU + userId);
bean.getQiNiuOssConfig().setBucketName(bucket); bean.getQiNiuOssConfig().setBucketName(bucket);
bean.getQiNiuOssConfig().setRegion(region); bean.getQiNiuOssConfig().setRegion(region);
if(bean.createBucket(bucket, region) == 1){ if (bean.createBucket(bucket, region) == 1) {
return Result.ok(bean.createBucket(bucket, region)); return Result.ok(bean.createBucket(bucket, region));
}else } else
return Result.fail("创建桶失败"); return Result.fail("创建桶失败");
} }
/** /**
@@ -280,7 +309,7 @@ public class SchisandraOssQiniuController {
* @date: 2024/7/8 13:34 * @date: 2024/7/8 13:34
*/ */
@PostMapping("init") @PostMapping("init")
public Result initQiniu(@RequestParam String userId,@RequestParam String Id) { public Result initQiniu(@RequestParam String userId, @RequestParam String Id) {
if (log.isInfoEnabled()) { if (log.isInfoEnabled()) {
log.info("SchisandraOssQiniuController.init.userId:{}", userId); log.info("SchisandraOssQiniuController.init.userId:{}", userId);
} }
@@ -289,15 +318,15 @@ public class SchisandraOssQiniuController {
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(schisandraOssQiniuDomainService.update(bo)){ if (schisandraOssQiniuDomainService.update(bo)) {
return qiNiuOssConfiguration.qiNiuOssClient(userId); return qiNiuOssConfiguration.qiNiuOssClient(userId);
}else{ } else {
return Result.fail("初始化失败"); return Result.fail("初始化失败");
} }
} }
@PostMapping("shutdown") @PostMapping("shutdown")
public Result shutdownQiniu(@RequestParam String userId,@RequestParam String Id){ public Result shutdownQiniu(@RequestParam String userId, @RequestParam String Id) {
if (log.isInfoEnabled()) { if (log.isInfoEnabled()) {
log.info("SchisandraOssQiniuController.shutdown.userId:{}", JSON.toJSONString(userId)); log.info("SchisandraOssQiniuController.shutdown.userId:{}", JSON.toJSONString(userId));
} }
@@ -305,10 +334,10 @@ public class SchisandraOssQiniuController {
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(schisandraOssQiniuDomainService.update(bo)){ if (schisandraOssQiniuDomainService.update(bo)) {
SpringUtil.unregisterBean(OssConstant.OssType.QINIU + userId); SpringUtil.unregisterBean(OssConstant.OssType.QINIU + userId);
return Result.ok("关闭成功"); return Result.ok("关闭成功");
}else{ } else {
return Result.fail("关闭失败"); return Result.fail("关闭失败");
} }
} }

View File

@@ -1,25 +1,19 @@
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.qcloud.cos.model.CopyResult; import com.qcloud.cos.model.CopyResult;
import com.qcloud.cos.model.DeleteObjectsRequest; import com.qcloud.cos.model.DeleteObjectsRequest;
import com.qcloud.cos.model.DeleteObjectsResult; import com.qcloud.cos.model.DeleteObjectsResult;
import com.schisandra.oss.application.convert.SchisandraOssTencentDTOConverter; import com.schisandra.oss.application.convert.SchisandraOssTencentDTOConverter;
import com.schisandra.oss.application.convert.SchisandraOssUpDTOConverter;
import com.schisandra.oss.application.dto.SchisandraOssTencentDTO; import com.schisandra.oss.application.dto.SchisandraOssTencentDTO;
import com.schisandra.oss.application.dto.SchisandraOssUpDTO;
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.tencent.TencentOssClient; import com.schisandra.oss.application.oss.core.tencent.TencentOssClient;
import com.schisandra.oss.application.oss.core.tencent.TencentOssConfiguration; import com.schisandra.oss.application.oss.core.tencent.TencentOssConfiguration;
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.SchisandraOssTencentBO; import com.schisandra.oss.domain.bo.SchisandraOssTencentBO;
import com.schisandra.oss.domain.bo.SchisandraOssUpBO;
import com.schisandra.oss.domain.redis.RedisUtil; 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.*;
@@ -27,17 +21,26 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
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.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.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
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.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/** /**
* 腾讯云对象存储配置表 controller * 腾讯云对象存储配置表 controller
@@ -155,7 +158,7 @@ public class SchisandraOssTencentController {
* @author zlg * @author zlg
* @date: 2024/6/29 13:27 * @date: 2024/6/29 13:27
*/ */
@CacheEvict(value = "TencentBucket", key = "#userId") // @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, "不能为空");
@@ -232,7 +235,6 @@ public class SchisandraOssTencentController {
} }
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]
@@ -241,11 +243,43 @@ public class SchisandraOssTencentController {
* @date: 2024/7/1 16:02 * @date: 2024/7/1 16:02
*/ */
@GetMapping("downloadFile") @GetMapping("downloadFile")
public Result<String> downloadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam String target) { public Result<String> downloadTencent(@RequestParam String userId, @RequestParam String bucket, @RequestParam List<String> listObjectsArgs, HttpServletResponse response) throws IOException {
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)); try {
HashMap<String, InputStream> list = bean.downloadTencentMany(bucket, listObjectsArgs);
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载.zip", "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
ServletOutputStream output = response.getOutputStream();
String[] path = new String[list.size()];
path = list.keySet().toArray(path);
//记录用户下载
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);
} catch (Exception e) {
return Result.fail();
}
return Result.ok();
} }
/** /**
@@ -306,9 +340,6 @@ public class SchisandraOssTencentController {
} }
/** /**
* 新增腾讯云对象存储配置表 * 新增腾讯云对象存储配置表
*/ */

View File

@@ -228,8 +228,7 @@ public class SchisandraUserOssController {
@GetMapping("selectUploadFileDiagramPerMonth") @GetMapping("selectUploadFileDiagramPerMonth")
public Result<Object> selectFileDiagramPerMonth(@RequestParam Long userId) { public Result<Object> selectFileDiagramPerMonth(@RequestParam Long userId) {
Preconditions.checkNotNull(userId, "userId不能为空"); Preconditions.checkNotNull(userId, "userId不能为空");
return Result.ok(schisandraFileHeatmapDomainService.selectFileDiagramPerMonth(String.valueOf(userId),0) return Result.ok(schisandraFileHeatmapDomainService.selectFileDiagramPerMonth(String.valueOf(userId),0));
.get("month"));
} }
/** /**
* @description: 查询用户下载文件每月 * @description: 查询用户下载文件每月
@@ -241,8 +240,7 @@ public class SchisandraUserOssController {
@GetMapping("selectDownloadFileDiagramPerMonth") @GetMapping("selectDownloadFileDiagramPerMonth")
public Result<Object> selectDownloadFileDiagramPerMonth(@RequestParam Long userId) { public Result<Object> selectDownloadFileDiagramPerMonth(@RequestParam Long userId) {
Preconditions.checkNotNull(userId, "userId不能为空"); Preconditions.checkNotNull(userId, "userId不能为空");
return Result.ok(schisandraFileHeatmapDomainService.selectFileDiagramPerMonth(String.valueOf(userId),1) return Result.ok(schisandraFileHeatmapDomainService.selectFileDiagramPerMonth(String.valueOf(userId),1));
.get("month"));
} }
/** /**
* @description: 查询用户最近预览文件 * @description: 查询用户最近预览文件

View File

@@ -10,6 +10,10 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import com.amazonaws.util.IOUtils;
import com.jd.platform.async.executor.Async;
import com.jd.platform.async.worker.WorkResult;
import com.jd.platform.async.wrapper.WorkerWrapper;
import com.qiniu.common.QiniuException; import com.qiniu.common.QiniuException;
import com.qiniu.storage.*; import com.qiniu.storage.*;
import com.qiniu.storage.model.FileInfo; import com.qiniu.storage.model.FileInfo;
@@ -39,9 +43,15 @@ import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder; import java.net.URLEncoder;
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;
import static com.aliyuncs.utils.Base64Helper.encode; import static com.aliyuncs.utils.Base64Helper.encode;
@@ -126,26 +136,51 @@ public class QiNiuOssClient implements StandardOssClient {
} }
return infos; return infos;
} }
public HashMap<String, InputStream> downLoadMany(List<String> target, String endpoint) throws ExecutionException, InterruptedException {
HashMap<String,InputStream> list = new HashMap<>();
List<WorkerWrapper> wrappers=new ArrayList<>();
target.forEach(path -> {
WorkerWrapper wrapper1 = new WorkerWrapper.Builder<String, InputStream>().worker((String dirname, Map<String, WorkerWrapper> allWrappers) -> {
try {
list.put(dirname,downLoad_open(dirname,endpoint));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}).param(path.toString()).id(path).callback((boolean success, String param, WorkResult<InputStream> re)->{
}).build();
wrappers.add(wrapper1);
});
Async.beginWork(3500L,new ThreadPoolExecutor(10, 100, 5L,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()), wrappers);
return list;
}
/** /**
* 七牛图片下载 * 七牛下载
* *
* @param os targetName endpoint * @param targetName endpoint
* @param endpoint * @param endpoint
* @return * @return
*/ */
@SneakyThrows @SneakyThrows
public void downLoad_open(OutputStream os, String targetName,String endpoint) { public InputStream downLoad_open(String targetName,String endpoint) {
String filename = URLEncoder.encode(targetName,"UTF-8").replace("+", "%20"); DownloadUrl downloadUrl = new DownloadUrl(endpoint, false, getKey(targetName, false));
DownloadUrl downloadUrl = new DownloadUrl(endpoint, false, getKey(filename, false));
try { try {
String url = downloadUrl.buildURL(); String urlStr = downloadUrl.buildURL();
HttpUtil.download(url, os, false); URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置超时间为3秒
conn.setConnectTimeout(3*1000);
//防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到输入流
InputStream inputStream = conn.getInputStream();
return inputStream;
} catch (QiniuException e) { } catch (QiniuException e) {
String errorMsg = String.format("%s下载失败", targetName); log.error(String.valueOf(e));
log.error(errorMsg, e);
throw new OssException(errorMsg, e);
} }
return null;
} }
public List<HashMap<String, String> >selectAllBucket() throws IOException{ public List<HashMap<String, String> >selectAllBucket() throws IOException{

View File

@@ -11,6 +11,10 @@ import cn.hutool.core.io.unit.DataSizeUtil;
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;
import com.alibaba.druid.util.StringUtils;
import com.jd.platform.async.executor.Async;
import com.jd.platform.async.worker.WorkResult;
import com.jd.platform.async.wrapper.WorkerWrapper;
import com.qcloud.cos.COSClient; import com.qcloud.cos.COSClient;
import com.qcloud.cos.exception.CosClientException; import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException; import com.qcloud.cos.exception.CosServiceException;
@@ -28,6 +32,7 @@ import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint;
import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; import com.schisandra.oss.application.oss.model.download.DownloadObjectStat;
import com.schisandra.oss.application.oss.model.upload.*; import com.schisandra.oss.application.oss.model.upload.*;
import com.schisandra.oss.application.oss.utils.OssPathUtil; import com.schisandra.oss.application.oss.utils.OssPathUtil;
import io.minio.ListObjectsArgs;
import io.minio.errors.*; import io.minio.errors.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@@ -35,16 +40,12 @@ import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.File; import java.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL; import java.net.URL;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutorService; import java.util.concurrent.*;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Slf4j @Slf4j
@@ -140,7 +141,7 @@ public class TencentOssClient implements StandardOssClient {
list.forEach(bucket -> { list.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",getTencentBucketSize(bucket.getName())); // names.put("size",getTencentBucketSize(bucket.getName()));
list1.add(names); list1.add(names);
}); });
return list1; return list1;
@@ -157,19 +158,44 @@ public class TencentOssClient implements StandardOssClient {
} }
return DataSizeUtil.format(fileSize); return DataSizeUtil.format(fileSize);
} }
public Download downloadTencent(String bucket, String target) { public HashMap<String,InputStream> downloadTencentMany(String bucket, List<String> target) throws ExecutionException, InterruptedException {
HashMap<String,InputStream> list = new HashMap<>();
List<WorkerWrapper> wrappers=new ArrayList<>();
target.forEach(path -> {
WorkerWrapper wrapper1 = new WorkerWrapper.Builder<String, InputStream>().worker((String dirName, Map<String, WorkerWrapper> allWrappers) -> {
try {
list.put(dirName,downloadTencent(bucket,dirName));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}).param(path.toString()).id(path).callback((boolean success, String param, WorkResult<InputStream> re)->{
}).build();
wrappers.add(wrapper1);
});
Async.beginWork(3500L,new ThreadPoolExecutor(10, 100, 5L,
TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()), wrappers);
return list;
}
public InputStream downloadTencent(String bucket, String target) {
ExecutorService threadPool = Executors.newFixedThreadPool(4); ExecutorService threadPool = Executors.newFixedThreadPool(4);
// 传入一个threadpool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池。 // 传入一个threadpool, 若不传入线程池, 默认TransferManager中会生成一个单线程的线程池。
TransferManager transferManager = new TransferManager(cosClient, threadPool); TransferManager transferManager = new TransferManager(cosClient, threadPool);
try { try {
Download download = transferManager.download(bucket, target, // File file = new File("D:\\java_project\\schisandra-cloud-storage\\");
new File("D:\\java_project\\schisandra-cloud-storage\\")); File file=File.createTempFile("dsd",".tmp");
Download download = transferManager.download(bucket, target,file);
download.waitForCompletion(); download.waitForCompletion();
return download; InputStream is = new FileInputStream(file);
return is;
} catch (InterruptedException e) { } catch (InterruptedException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} }
} }

View File

@@ -108,6 +108,6 @@ public interface SchisandraFileHeatmapDomainService {
* @date: 2024/7/13 10:33 * @date: 2024/7/13 10:33
*/ */
int insertFileHeatmapBatch(List<SchisandraFileHeatmapBO> schisandraFileHeatmapBOList); int insertFileHeatmapBatch(List<SchisandraFileHeatmapBO> schisandraFileHeatmapBOList);
HashMap<Object,Object> selectFileDiagramPerMonth(String userId,int type); List<Object> selectFileDiagramPerMonth(String userId,int type);
List<HashMap<Object,Object>> selectRecentPreviewFile(String userId); List<HashMap<Object,Object>> selectRecentPreviewFile(String userId);
} }

View File

@@ -36,4 +36,8 @@ public interface SchisandraOssQiniuDomainService {
SchisandraOssQiniuBO getQiniuOssConfig(String userId); SchisandraOssQiniuBO getQiniuOssConfig(String userId);
List<SchisandraOssQiniuBO> selectAll(); List<SchisandraOssQiniuBO> selectAll();
SchisandraOssQiniuBO getEndpointByuserIdAndBucket(Long id,String bucket);
} }

View File

@@ -202,10 +202,16 @@ public class SchisandraFileHeatmapDomainServiceImpl implements SchisandraFileHea
} }
@Override @Override
public HashMap<Object, Object> selectFileDiagramPerMonth(String userId,int type) { public List<Object> selectFileDiagramPerMonth(String userId,int type) {
HashMap<Object,Object> map=new HashMap<>(); List<Row> rows=schisandraFileHeatmapService.selectFileDiagramPerMonth(userId, type);
map.put("month",schisandraFileHeatmapService.selectFileDiagramPerMonth(userId, type)); List<Object> list2=new ArrayList<>();
return map; rows.forEach(obj->{
List<String> list1=new ArrayList<>();
list1.add(String.valueOf(obj.get("date")));
list1.add(String.valueOf(obj.get("count")));
list2.add(list1);
});
return list2;
} }
@Override @Override
public List<HashMap<Object, Object>> selectRecentPreviewFile(String userId) { public List<HashMap<Object, Object>> selectRecentPreviewFile(String userId) {

View File

@@ -87,4 +87,11 @@ public class SchisandraOssQiniuDomainServiceImpl implements SchisandraOssQiniuDo
List<SchisandraOssQiniu> list = schisandraOssQiniuService.selectAll(); List<SchisandraOssQiniu> list = schisandraOssQiniuService.selectAll();
return SchisandraOssQiniuBOConverter.INSTANCE.convertEntityToBOList(list); return SchisandraOssQiniuBOConverter.INSTANCE.convertEntityToBOList(list);
} }
@Override
public SchisandraOssQiniuBO getEndpointByuserIdAndBucket(Long userId, String bucket) {
SchisandraOssQiniu schisandraOssQiniu = schisandraOssQiniuService.getEndpointByuserIdAnd(userId,bucket);
SchisandraOssQiniuBO schisandraOssQiniuBO = SchisandraOssQiniuBOConverter.INSTANCE.convertEntityToBO(schisandraOssQiniu);
return schisandraOssQiniuBO;
}
} }

View File

@@ -33,6 +33,8 @@ public class SchisandraOssQiniu implements Serializable {
@Column("user_id") @Column("user_id")
private Long userId; private Long userId;
@Column("endpoint")
private String endpoint;
/** /**
* *
*/ */

View File

@@ -13,6 +13,8 @@ import java.util.List;
*/ */
public interface SchisandraOssQiniuService { public interface SchisandraOssQiniuService {
SchisandraOssQiniu getEndpointByuserIdAnd(Long userId, String bucket);
/** /**
* 通过ID查询单条数据 * 通过ID查询单条数据
* *

View File

@@ -21,6 +21,11 @@ public class SchisandraOssQiniuServiceImpl implements SchisandraOssQiniuService
@Resource @Resource
private SchisandraOssQiniuDao schisandraOssQiniuDao; private SchisandraOssQiniuDao schisandraOssQiniuDao;
@Override
public SchisandraOssQiniu getEndpointByuserIdAnd(Long userId, String bucket) {
return schisandraOssQiniuDao.selectOneByCondition(SchisandraOssQiniuTableDef.SCHISANDRA_OSS_QINIU.USER_ID.eq(userId).and(SchisandraOssQiniuTableDef.SCHISANDRA_OSS_QINIU.BUCKET_NAME.eq(bucket)));
}
/** /**
* 通过ID查询单条数据 * 通过ID查询单条数据
* *