|
@@ -16,6 +16,7 @@ import com.backendsys.modules.system.entity.SysCommon;
|
|
|
import com.backendsys.modules.system.entity.SysUser;
|
|
|
import com.backendsys.modules.system.service.SysCommonService;
|
|
|
import com.backendsys.modules.upload.dao.SysFileDao;
|
|
|
+import com.backendsys.modules.upload.entity.MultipartUploadParams;
|
|
|
import com.backendsys.modules.upload.entity.SysFile;
|
|
|
import com.backendsys.modules.upload.enums.StyleEnums;
|
|
|
import com.backendsys.modules.upload.service.SysFileMultipartService;
|
|
@@ -98,25 +99,22 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
}
|
|
|
|
|
|
// [方法] 上传事件
|
|
|
- private SysFile uploadInitEvent(MultipartFile multipartFile, Long category_id, Integer target, Integer upload_chunk_count, String md5) {
|
|
|
+ private SysFile uploadInitEvent(MultipartUploadParams multipartUploadParams, Integer target) {
|
|
|
System.out.println("[系统配置] 上传目标(-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云): " + target);
|
|
|
|
|
|
- String filename = multipartFile.getOriginalFilename();
|
|
|
- if (filename.length() > 50) throw new CustException("文件名长度不能超过 50 字符");
|
|
|
-
|
|
|
String target_label = StyleEnums.targetToLabel(target);
|
|
|
String upload_id = null;
|
|
|
String object_key = null;
|
|
|
|
|
|
// target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
|
|
|
if (target == 1) {
|
|
|
- InitiateMultipartUploadResult uploadResult = tencentCosService.initiateMultipartUpload(multipartFile);
|
|
|
+ InitiateMultipartUploadResult uploadResult = tencentCosService.initiateMultipartUpload(multipartUploadParams.getFilename());
|
|
|
upload_id = uploadResult.getUploadId();
|
|
|
object_key = uploadResult.getKey();
|
|
|
}
|
|
|
// 3: 抖音云
|
|
|
if (target == 3) {
|
|
|
- CreateMultipartUploadOutput uploadResult = douyinTosService.initiateMultipartUpload(multipartFile);
|
|
|
+ CreateMultipartUploadOutput uploadResult = douyinTosService.initiateMultipartUpload(multipartUploadParams.getFilename());
|
|
|
upload_id = uploadResult.getUploadID();
|
|
|
object_key = uploadResult.getKey();
|
|
|
}
|
|
@@ -128,18 +126,18 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
|
|
|
// [新增] 上传文件记录
|
|
|
SysFile sysFileEntity = new SysFile();
|
|
|
- sysFileEntity.setCategory_id(category_id);
|
|
|
+ sysFileEntity.setCategory_id(multipartUploadParams.getCategory_id());
|
|
|
sysFileEntity.setUser_id(httpRequestUtil.getUserId());
|
|
|
sysFileEntity.setUpload_id(upload_id);
|
|
|
- sysFileEntity.setUpload_chunk_count(upload_chunk_count);
|
|
|
+ sysFileEntity.setUpload_chunk_count(multipartUploadParams.getUpload_chunk_count());
|
|
|
sysFileEntity.setUpload_chunk_index(0);
|
|
|
// sysFileEntity.setName(FileNameUtil.getName(object_key));
|
|
|
- sysFileEntity.setName(filename);
|
|
|
+ sysFileEntity.setName(multipartUploadParams.getFilename());
|
|
|
sysFileEntity.setObject_key(object_key);
|
|
|
sysFileEntity.setTarget(target);
|
|
|
- sysFileEntity.setContent_type(multipartFile.getContentType());
|
|
|
- sysFileEntity.setSize(multipartFile.getSize());
|
|
|
- sysFileEntity.setMd5(md5);
|
|
|
+ sysFileEntity.setContent_type(multipartUploadParams.getContent_type());
|
|
|
+ sysFileEntity.setSize(multipartUploadParams.getSize());
|
|
|
+ sysFileEntity.setMd5(multipartUploadParams.getMd5());
|
|
|
sysFileDao.insert(sysFileEntity);
|
|
|
|
|
|
return sysFileEntity;
|
|
@@ -148,14 +146,7 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
|
|
|
// 1.初始化分块上传 (获得 upload_id, object_key)
|
|
|
@Override
|
|
|
- public Map<String, Object> multipartUploadInit(MultipartFile multipartFile, Long category_id, Integer upload_chunk_count, String md5) {
|
|
|
-
|
|
|
-// if (multipartFile.isEmpty()) throw new CustException("file 上传文件不能为空");
|
|
|
-// if (upload_chunk_count == null) throw new CustException("upload_chunk_count 分块数量不能为空");
|
|
|
-// if (md5.isEmpty()) throw new CustException("md5 不能为空");
|
|
|
-//
|
|
|
-// String filename = multipartFile.getOriginalFilename();
|
|
|
-// if (filename.length() > 50) throw new CustException("文件名长度不能超过 50 字符");
|
|
|
+ public Map<String, Object> multipartUploadInit(MultipartUploadParams multipartUploadParams) {
|
|
|
|
|
|
// // 按用户加锁
|
|
|
// RLock lock = redissonClient.getLock("lock::multipart-upload::user-id::" + SecurityUtil.getUserId());
|
|
@@ -174,67 +165,65 @@ public class SysFileMultipartServiceImpl implements SysFileMultipartService {
|
|
|
|
|
|
SysFile sysFileEntity = null;
|
|
|
|
|
|
- return Map.of("test", 1);
|
|
|
-
|
|
|
-// // [弃用] 获取大文件流需要比较久的时间
|
|
|
-// // 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<>();
|
|
|
-// wrapperFile.eq(SysFile::getMd5, md5);
|
|
|
-// wrapperFile.eq(SysFile::getUser_id, SecurityUtil.getUserId());
|
|
|
-//
|
|
|
-// // [DB] 查询已存在的文件分块记录 (只有完全上传成功,才会有 MD5)
|
|
|
-// // - 异常情况:如果有两个相同的文件,一个上传50%,一个上传成功,就会出现以下这种情况,需要手动解决
|
|
|
-// List<SysFile> sysFileEntityList = sysFileDao.selectList(wrapperFile);
|
|
|
-// if (sysFileEntityList != null && sysFileEntityList.size() > 1) {
|
|
|
-// throw new CustException("存在 " + sysFileEntityList.size() + " 个相同MD5 (" + md5 + ") 的文件,请删除后再重新上传");
|
|
|
-// }
|
|
|
-//
|
|
|
-// 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, 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, md5);
|
|
|
-// // [格式化] 封面 (图片类型)
|
|
|
-// 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());
|
|
|
-// resp.put("md5", md5);
|
|
|
-// resp.put("is_exist", is_exist);
|
|
|
-// resp.put("file_info", is_exist ? sysFileEntity : null);
|
|
|
-// return resp;
|
|
|
-//
|
|
|
-//// } catch (InterruptedException e) { throw new RuntimeException(e);
|
|
|
-//// } finally { lock.unlock(); }
|
|
|
+ // [弃用] 获取大文件流需要比较久的时间
|
|
|
+ // 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<>();
|
|
|
+ wrapperFile.eq(SysFile::getMd5, multipartUploadParams.getMd5());
|
|
|
+ wrapperFile.eq(SysFile::getUser_id, SecurityUtil.getUserId());
|
|
|
+
|
|
|
+ // [DB] 查询已存在的文件分块记录 (只有完全上传成功,才会有 MD5)
|
|
|
+ // - 异常情况:如果有两个相同的文件,一个上传50%,一个上传成功,就会出现以下这种情况,需要手动解决
|
|
|
+ List<SysFile> sysFileEntityList = sysFileDao.selectList(wrapperFile);
|
|
|
+ if (sysFileEntityList != null && sysFileEntityList.size() > 1) {
|
|
|
+ throw new CustException("存在 " + sysFileEntityList.size() + " 个相同MD5 (" + multipartUploadParams.getMd5() + ") 的文件,请删除后再重新上传");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sysFileEntityList != null && sysFileEntityList.size() > 0) {
|
|
|
+ is_exist = true;
|
|
|
+ // 将已存在的文件,赋值
|
|
|
+ sysFileEntity = sysFileEntityList.get(0);
|
|
|
+ // [DB] 更新文件 (文件分类、上传时间)
|
|
|
+ sysFileEntity.setCategory_id(multipartUploadParams.getCategory_id());
|
|
|
+ sysFileEntity.setUpload_time(DateUtil.now());
|
|
|
+ sysFileDao.updateById(sysFileEntity);
|
|
|
+ } else {
|
|
|
+ // [DB] 创建新的文件
|
|
|
+ sysFileEntity = uploadInitEvent(multipartUploadParams, UPLOAD_TARGET.get());
|
|
|
+ // [格式化] 封面 (图片类型)
|
|
|
+ sysFileEntity = setThumbUrl(sysFileEntity, UPLOAD_THUMB_SIZE.get(), UPLOAD_THUMB_SIZE.get(), StyleEnums.THUMB_BACKGROUND.getValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // 不开启 MD5秒 传,则直接初始化分块
|
|
|
+ // [DB] 创建新的文件
|
|
|
+ sysFileEntity = uploadInitEvent(multipartUploadParams, UPLOAD_TARGET.get());
|
|
|
+ // [格式化] 封面 (图片类型)
|
|
|
+ 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", multipartUploadParams.getUpload_chunk_count());
|
|
|
+ resp.put("upload_id", sysFileEntity.getUpload_id());
|
|
|
+ resp.put("object_key", sysFileEntity.getObject_key());
|
|
|
+ resp.put("md5", multipartUploadParams.getMd5());
|
|
|
+ resp.put("is_exist", is_exist);
|
|
|
+ resp.put("file_info", is_exist ? sysFileEntity : null);
|
|
|
+ return resp;
|
|
|
+
|
|
|
+// } catch (InterruptedException e) { throw new RuntimeException(e);
|
|
|
+// } finally { lock.unlock(); }
|
|
|
}
|
|
|
|
|
|
// 2.上传分块
|