Browse Source

fix upload file change redis

tags/B.2.2.0.6_20231012_base
yk 2 years ago
parent
commit
c777fe5312
2 changed files with 33 additions and 42 deletions
  1. +12
    -0
      xueyi-common/xueyi-common-redis/src/main/java/com/xueyi/common/redis/utils/RedisUtil.java
  2. +21
    -42
      xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmResourcesController.java

+ 12
- 0
xueyi-common/xueyi-common-redis/src/main/java/com/xueyi/common/redis/utils/RedisUtil.java View File

@@ -40,6 +40,18 @@ public class RedisUtil {
return redisTemplate.opsForList().range(key, 0, -1).stream().map(json-> JSONObject.parseObject(json.toString())).collect(Collectors.toList());
}

public static List<byte[]> getBytesList(String key) {
return redisTemplate.opsForList().range(key, 0, -1).stream().map(json-> (byte[])json).collect(Collectors.toList());
}

public static void setBytesList(String key, byte[] bytes) {
redisTemplate.opsForList().leftPush(key, bytes);
}

public static Long getListCount(String key) {
return redisTemplate.opsForList().size(key);
}

public static Boolean existed(String key){
return redisTemplate.hasKey(key);
}


+ 21
- 42
xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/resource/controller/DmResourcesController.java View File

@@ -148,70 +148,49 @@ public class DmResourcesController extends BaseController<DmResourcesQuery, DmRe
private static final String PARAM_TYPE = "type";


private MultipartFile[] completedChunks; // 用于跟踪已上传完毕的块

@PostMapping("/chunkUpload")
public AjaxResult uploadChunk(
@RequestParam("file") MultipartFile file,
@RequestParam("chunkIndex") int chunkIndex,
@RequestParam("chunkCount") int totalChunks
@RequestParam("chunkCount") int totalChunks,
@RequestParam("uploadUuid") String uuid
) throws IOException {
if (completedChunks == null) {
completedChunks = new MultipartFile[totalChunks];
List<byte[]> bytesList = new ArrayList<>();
String key = "saas:upload:chunks:" + uuid;
if (RedisUtil.existed(key)){
bytesList = RedisUtil.getBytesList(key);
}
logger.info("completeChunks size:{}", completedChunks.length);

logger.info("第{}/{}块上传成功", chunkIndex, totalChunks);
logger.info("第{}/{}块上传成功", chunkIndex + 1, totalChunks);

completedChunks[chunkIndex] = file; // 标记当前块已上传完毕
String uuid = IdUtil.randomUUID();
RedisUtil.setBytesList(key+":"+chunkIndex, file.getBytes());
// String uuid = IdUtil.randomUUID();

// 如果所有块都上传完毕,开始合并
if (allChunksUploaded(completedChunks)) {
if (RedisUtil.getListCount(key) == totalChunks) {
logger.info("所有块上传完毕,开始合并...");
String extension = FileTypeUtil.getExtension(file);
return executeUpload(mergeChunks(completedChunks), extension, uuid);
return executeUpload(mergeChunks(bytesList), extension, uuid);
}
logger.info("上传完毕");

return AjaxResult.error("上传文件异常,请联系管理员!");
}

private boolean allChunksUploaded(MultipartFile[] completedChunks) {
for (MultipartFile completed : completedChunks) {
if (null == completed) {
return false; // 如果有任何一个块没有上传完毕,返回false
}
private MultipartFile mergeChunks(List<byte[]> byteArrays) {
// 合并所有分片的byte数组为一个byte数组
int totalSize = byteArrays.stream().mapToInt(byteArray -> byteArray.length).sum();
byte[] mergedBytes = new byte[totalSize];
int currentIndex = 0;
for (byte[] bytes : byteArrays) {
System.arraycopy(bytes, 0, mergedBytes, currentIndex, bytes.length);
currentIndex += bytes.length;
}
return true; // 所有块都上传完毕
}

private MultipartFile mergeChunks(MultipartFile[] multipartFiles) {
List<byte[]> byteArrays = null;
try {
byteArrays = new ArrayList<>();

for (MultipartFile part : multipartFiles) {
// 从每个分片的MultipartFile中读取数据并存储到byte数组中
byte[] bytes = part.getBytes();
byteArrays.add(bytes);
}

// 合并所有分片的byte数组为一个byte数组
int totalSize = byteArrays.stream().mapToInt(byteArray -> byteArray.length).sum();
byte[] mergedBytes = new byte[totalSize];
int currentIndex = 0;
for (byte[] bytes : byteArrays) {
System.arraycopy(bytes, 0, mergedBytes, currentIndex, bytes.length);
currentIndex += bytes.length;
}
completedChunks = null;
// 创建一个新的MultipartFile对象,代表合并后的文件
return new ByteArrayMultipartFile(mergedBytes);

// 创建一个新的MultipartFile对象,代表合并后的文件
return new ByteArrayMultipartFile(mergedBytes);
} catch (IOException e) {
throw new RuntimeException(e);
}
}

/**


Loading…
Cancel
Save