|
@@ -98,7 +98,7 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
}
|
|
|
|
|
|
// [方法] 上传事件
|
|
|
- private SysFile uploadInitEvent(MultipartFile multipartFile, Long category_id, Integer target, Integer upload_chunk_count) {
|
|
|
+ private SysFile uploadInitEvent(MultipartFile multipartFile, Long category_id, Integer target, Integer upload_chunk_count, String md5) {
|
|
|
System.out.println("[系统配置] 上传目标(-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云): " + target);
|
|
|
|
|
|
String filename = multipartFile.getOriginalFilename();
|
|
@@ -139,6 +139,7 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
sysFileEntity.setTarget(target);
|
|
|
sysFileEntity.setContent_type(multipartFile.getContentType());
|
|
|
sysFileEntity.setSize(multipartFile.getSize());
|
|
|
+ sysFileEntity.setMd5(md5);
|
|
|
sysFileDao.insert(sysFileEntity);
|
|
|
|
|
|
return sysFileEntity;
|
|
@@ -166,17 +167,19 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
if (sysCommon.getTag().equals("UPLOAD_MD5_DUPLICATE")) UPLOAD_MD5_DUPLICATE.set(Convert.toBool(sysCommon.getValue()));
|
|
|
});
|
|
|
|
|
|
+ try {
|
|
|
|
|
|
- // 如果开启了 MD5秒传,则判断文件是否上传过,是的话就直接返回
|
|
|
- // [系统配置] 是否启用文件MD5查重 (仅判断用户自己上传过的文件)
|
|
|
- // - 存在,则根据文件MD5 判断是否上传过文件 (仅更新时间,不上传已存在的文件,允许更新文件分类)
|
|
|
- // - 存在,如果存在两个相同 md5 以上的文件,则需要排重后再上传 (如果是不同用户
|
|
|
- // - 不存在,则走上传流程
|
|
|
- Boolean is_exist = false;
|
|
|
- SysFile sysFileEntity = null;
|
|
|
- if (UPLOAD_MD5_DUPLICATE.get()) {
|
|
|
- try {
|
|
|
- String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
|
|
|
+ SysFile sysFileEntity = null;
|
|
|
+
|
|
|
+ String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
|
|
|
+
|
|
|
+ // 如果开启了 MD5秒传,则判断文件是否上传过,是的话就直接返回
|
|
|
+ // [系统配置] 是否启用文件MD5查重 (仅判断用户自己上传过的文件)
|
|
|
+ // - 存在,则根据文件MD5 判断是否上传过文件 (仅更新时间,不上传已存在的文件,允许更新文件分类)
|
|
|
+ // - 存在,如果存在两个相同 md5 以上的文件,则需要排重后再上传 (如果是不同用户
|
|
|
+ // - 不存在,则走上传流程
|
|
|
+ Boolean is_exist = false;
|
|
|
+ if (UPLOAD_MD5_DUPLICATE.get()) {
|
|
|
|
|
|
// 排除文件异常的情况(出现两个以上相同MD5的文件)
|
|
|
LambdaQueryWrapper<SysFile> wrapperFile = new LambdaQueryWrapper<>();
|
|
@@ -191,44 +194,42 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
}
|
|
|
|
|
|
if (sysFileEntityList != null && sysFileEntityList.size() > 0) {
|
|
|
-
|
|
|
is_exist = true;
|
|
|
// 将已存在的文件,赋值
|
|
|
sysFileEntity = sysFileEntityList.get(0);
|
|
|
// [DB] 更新文件 (文件分类、上传时间)
|
|
|
sysFileEntity.setCategory_id(category_id);
|
|
|
sysFileEntity.setUpload_time(DateUtil.now());
|
|
|
-
|
|
|
sysFileDao.updateById(sysFileEntity);
|
|
|
} else {
|
|
|
// [DB] 创建新的文件
|
|
|
- sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count);
|
|
|
+ sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count, md5);
|
|
|
// [格式化] 封面 (图片类型)
|
|
|
sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
|
|
|
}
|
|
|
|
|
|
- } catch (IOException e) {
|
|
|
- throw new RuntimeException(e);
|
|
|
+ } else {
|
|
|
+ // 不开启 MD5秒 传,则直接初始化分块
|
|
|
+ // [DB] 创建新的文件
|
|
|
+ sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count, md5);
|
|
|
+ // [格式化] 封面 (图片类型)
|
|
|
+ sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
|
|
|
}
|
|
|
- } else {
|
|
|
- // 不开启 MD5秒 传,则直接初始化分块
|
|
|
- // [DB] 创建新的文件
|
|
|
- sysFileEntity = uploadInitEvent(multipartFile, category_id, UPLOAD_TARGET.get(), upload_chunk_count);
|
|
|
- // [格式化] 封面 (图片类型)
|
|
|
- sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
|
|
|
- }
|
|
|
|
|
|
- Map<String, Object> resp = new LinkedHashMap<>();
|
|
|
- resp.put("target", UPLOAD_TARGET.get());
|
|
|
- resp.put("target_label", StyleEnums.targetToLabel(UPLOAD_TARGET.get()));
|
|
|
- resp.put("upload_chunk_count", upload_chunk_count);
|
|
|
- resp.put("upload_id", sysFileEntity.getUpload_id());
|
|
|
- resp.put("object_key", sysFileEntity.getObject_key());
|
|
|
- // MD5 秒传,返回已上传的文件信息
|
|
|
- resp.put("is_exist", is_exist);
|
|
|
- resp.put("file_info", is_exist ? sysFileEntity : null);
|
|
|
- return resp;
|
|
|
+ Map<String, Object> resp = new LinkedHashMap<>();
|
|
|
+ resp.put("target", UPLOAD_TARGET.get());
|
|
|
+ resp.put("target_label", StyleEnums.targetToLabel(UPLOAD_TARGET.get()));
|
|
|
+ resp.put("upload_chunk_count", upload_chunk_count);
|
|
|
+ resp.put("upload_id", sysFileEntity.getUpload_id());
|
|
|
+ resp.put("object_key", sysFileEntity.getObject_key());
|
|
|
+ resp.put("md5", md5);
|
|
|
+ resp.put("is_exist", is_exist);
|
|
|
+ resp.put("file_info", is_exist ? sysFileEntity : null);
|
|
|
+ return resp;
|
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 2.上传分块
|
|
@@ -251,12 +252,12 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
String object_key = sysFileEntity.getObject_key();
|
|
|
Integer upload_chunk_size = sysFileEntity.getUpload_chunk_count();
|
|
|
if (upload_chunk_index > upload_chunk_size) throw new CustException("分块索引(index)不能大于分块数量(count)");
|
|
|
+ if (upload_chunk_index == upload_chunk_size) throw new CustException("分块索引(index)等于分块数量(count),请调用合并接口");
|
|
|
|
|
|
+ // 进入分块上传流程
|
|
|
if (upload_chunk_index < upload_chunk_size) {
|
|
|
// 分片编号从 1 开始,最大为 10000。除最后一个分片以外,其他分片大小最小为 4MiB
|
|
|
- if (multipartFile.getSize() < 4 * 1024 * 1024) {
|
|
|
- throw new CustException("分块文件大小不能小于 4MB");
|
|
|
- }
|
|
|
+ if (multipartFile.getSize() < 4 * 1024 * 1024) throw new CustException("分块文件大小不能小于 4MB");
|
|
|
}
|
|
|
|
|
|
// 获得公共配置
|