|
@@ -1,5 +1,6 @@
|
|
|
package com.backendsys.modules.upload.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.io.file.FileNameUtil;
|
|
|
import cn.hutool.crypto.digest.DigestUtil;
|
|
@@ -7,6 +8,7 @@ import com.backendsys.exception.CustException;
|
|
|
import com.backendsys.modules.common.config.security.utils.HttpRequestUtil;
|
|
|
import com.backendsys.modules.sdk.douyincloud.tos.service.DouyinTosService;
|
|
|
import com.backendsys.modules.sdk.tencentcloud.cos.service.TencentCosService;
|
|
|
+import com.backendsys.modules.system.service.SysCommonService;
|
|
|
import com.backendsys.modules.upload.dao.SysUploadDao;
|
|
|
import com.backendsys.modules.upload.entity.SysUpload;
|
|
|
import com.backendsys.modules.upload.entity.SysUploadResult;
|
|
@@ -16,9 +18,7 @@ import com.backendsys.utils.response.PageInfoResult;
|
|
|
import com.backendsys.utils.v2.PageUtils;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.qcloud.cos.model.UploadResult;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
@@ -33,15 +33,16 @@ public class SysUploadServiceImpl implements SysUploadService {
|
|
|
@Autowired
|
|
|
private HttpRequestUtil httpRequestUtil;
|
|
|
|
|
|
- @Autowired
|
|
|
- private SysUploadDao sysUploadDao;
|
|
|
-
|
|
|
@Autowired
|
|
|
private TencentCosService tencentCosService;
|
|
|
-
|
|
|
@Autowired
|
|
|
private DouyinTosService douyinTosService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SysUploadDao sysUploadDao;
|
|
|
+ @Autowired
|
|
|
+ private SysCommonService sysCommonService;
|
|
|
+
|
|
|
/**
|
|
|
* 获取上传文件列表
|
|
|
*/
|
|
@@ -52,65 +53,102 @@ public class SysUploadServiceImpl implements SysUploadService {
|
|
|
return new PageInfoResult(list).toEntity();
|
|
|
}
|
|
|
|
|
|
+ // [方法] 上传事件
|
|
|
+ private SysUpload uploadEvent(MultipartFile multipartFile, Long category_id, Integer target) {
|
|
|
+ try {
|
|
|
+ SysUploadResult uploadResult = new SysUploadResult();
|
|
|
+
|
|
|
+ // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
|
|
|
+ if (target == 1) {
|
|
|
+ // [腾讯云-上传对象]
|
|
|
+ uploadResult = tencentCosService.putObject(multipartFile, null);
|
|
|
+ }
|
|
|
+ if (target == 3) {
|
|
|
+ // [抖音云-上传对象]
|
|
|
+ uploadResult = douyinTosService.putObject(multipartFile, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ // [新增] 上传文件记录
|
|
|
+ SysUpload sysUploadEntity = new SysUpload();
|
|
|
+ sysUploadEntity.setCategory_id(category_id);
|
|
|
+ sysUploadEntity.setRequest_id(uploadResult.getRequest_id());
|
|
|
+ sysUploadEntity.setUser_id(httpRequestUtil.getUserId());
|
|
|
+ sysUploadEntity.setObject_key(uploadResult.getKey());
|
|
|
+ sysUploadEntity.setName(FileNameUtil.getName(uploadResult.getKey()));
|
|
|
+ sysUploadEntity.setContent_type(multipartFile.getContentType());
|
|
|
+ sysUploadEntity.setUrl(uploadResult.getDomain() + "/" + uploadResult.getKey());
|
|
|
+ sysUploadEntity.setSize(multipartFile.getSize());
|
|
|
+ sysUploadEntity.setMd5(uploadResult.getE_tag().replace("\"", ""));
|
|
|
+ sysUploadEntity.setTarget(target);
|
|
|
+ sysUploadEntity.setCreate_time(DateUtil.now());
|
|
|
+ sysUploadEntity.setUpdate_time(DateUtil.now());
|
|
|
+ sysUploadDao.insert(sysUploadEntity);
|
|
|
+
|
|
|
+ return sysUploadEntity;
|
|
|
+
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 上传文件 (单文件大小不超过 n)
|
|
|
* - target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
|
|
|
*/
|
|
|
@Override
|
|
|
public SysUpload uploadSmall(MultipartFile multipartFile, Long category_id, Integer target) {
|
|
|
- try {
|
|
|
|
|
|
- if (target == null) throw new CustException("target 上传目标不能为空 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)");
|
|
|
+ if (target == null) throw new CustException("target 上传目标不能为空 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)");
|
|
|
|
|
|
- // 判断文件是否超过大小
|
|
|
- long MAX_SIZE = 100L * 1024 * 1024; // 100MB
|
|
|
- if (multipartFile.getSize() > MAX_SIZE) {
|
|
|
- throw new CustException("上传文件不能大于 " + MAX_SIZE / 1024 / 1024 + " MB,请使用大文件上传功能");
|
|
|
- }
|
|
|
+ // [系统配置] 单文件上传大小限制(MB)
|
|
|
+ Long UPLOAD_MAX_SIZE_MB = Convert.toLong(sysCommonService.getCommonByTag("UPLOAD_MAX_SIZE_MB"));
|
|
|
+ System.out.println("[系统配置] 单文件上传大小限制(MB): " + UPLOAD_MAX_SIZE_MB);
|
|
|
|
|
|
- // 根据文件MD5 判断是否上传过文件 (如果上传过,则仅更新记录,不再上传文件)
|
|
|
- String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
|
|
|
- SysUpload sysUploadEntity = sysUploadDao.selectOne(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getMd5, md5));
|
|
|
- if (sysUploadEntity == null) {
|
|
|
+ // 判断文件是否超过大小
|
|
|
+ Long MAX_SIZE = UPLOAD_MAX_SIZE_MB * 1024 * 1024;
|
|
|
+ if (multipartFile.getSize() > MAX_SIZE) {
|
|
|
+ throw new CustException("上传文件不能大于 " + MAX_SIZE / 1024 / 1024 + " MB,请使用大文件上传功能");
|
|
|
+ }
|
|
|
|
|
|
- SysUploadResult uploadResult = new SysUploadResult();
|
|
|
+ try {
|
|
|
|
|
|
- // target: 上传目标 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
|
|
|
- if (target == 1) {
|
|
|
- // [腾讯云-上传对象]
|
|
|
- uploadResult = tencentCosService.putObject(multipartFile, null);
|
|
|
+ // [系统配置] 是否启用文件MD5查重
|
|
|
+ Boolean UPLOAD_MD5_DUPLICATE = Convert.toBool(sysCommonService.getCommonByTag("UPLOAD_MD5_DUPLICATE"));
|
|
|
+ System.out.println("[系统配置] 是否启用文件MD5查重: " + UPLOAD_MD5_DUPLICATE);
|
|
|
+ if (UPLOAD_MD5_DUPLICATE) {
|
|
|
+ // - 是
|
|
|
+ // 根据文件MD5 判断是否上传过文件
|
|
|
+ // - 如果上传过,则仅更新记录,不再上传文件,仅更新文件分类
|
|
|
+ // - 如果存在
|
|
|
+ String md5 = DigestUtil.md5Hex(multipartFile.getInputStream());
|
|
|
+ List<SysUpload> sysUploadEntityList = sysUploadDao.selectList(new LambdaQueryWrapper<SysUpload>().eq(SysUpload::getMd5, md5));
|
|
|
+ if (sysUploadEntityList != null && sysUploadEntityList.size() > 1) {
|
|
|
+ throw new CustException("存在 " + sysUploadEntityList.size() + " 个相同Md5 (" + md5 + ") 的文件,请先排重后再上传");
|
|
|
}
|
|
|
- if (target == 3) {
|
|
|
- // [抖音云-上传对象]
|
|
|
- uploadResult = douyinTosService.putObject(multipartFile, null);
|
|
|
+
|
|
|
+ SysUpload sysUploadEntity = (sysUploadEntityList != null) ? sysUploadEntityList.get(0) : null;
|
|
|
+ if (sysUploadEntity == null) {
|
|
|
+ // [方法] 上传事件
|
|
|
+ sysUploadEntity = uploadEvent(multipartFile, category_id, target);
|
|
|
+ } else {
|
|
|
+ // [更新] 上传文件记录 (更换文件分类)
|
|
|
+ sysUploadEntity.setCategory_id(category_id);
|
|
|
+ sysUploadEntity.setUpdate_time(DateUtil.now());
|
|
|
+ sysUploadDao.updateById(sysUploadEntity);
|
|
|
}
|
|
|
+ return sysUploadEntity;
|
|
|
|
|
|
- // [新增] 上传文件记录
|
|
|
- sysUploadEntity = new SysUpload();
|
|
|
- sysUploadEntity.setCategory_id(category_id);
|
|
|
- sysUploadEntity.setRequest_id(uploadResult.getRequest_id());
|
|
|
- sysUploadEntity.setUser_id(httpRequestUtil.getUserId());
|
|
|
- sysUploadEntity.setObject_key(uploadResult.getKey());
|
|
|
- sysUploadEntity.setName(FileNameUtil.getName(uploadResult.getKey()));
|
|
|
- sysUploadEntity.setContent_type(multipartFile.getContentType());
|
|
|
- sysUploadEntity.setUrl(uploadResult.getDomain() + "/" + uploadResult.getKey());
|
|
|
- sysUploadEntity.setSize(multipartFile.getSize());
|
|
|
- sysUploadEntity.setMd5(uploadResult.getE_tag());
|
|
|
- sysUploadEntity.setTarget(target);
|
|
|
- sysUploadEntity.setCreate_time(DateUtil.now());
|
|
|
- sysUploadEntity.setUpdate_time(DateUtil.now());
|
|
|
- sysUploadDao.insert(sysUploadEntity);
|
|
|
} else {
|
|
|
- // [更新] 上传文件记录 (更换文件分类)
|
|
|
- sysUploadEntity.setCategory_id(category_id);
|
|
|
- sysUploadEntity.setUpdate_time(DateUtil.now());
|
|
|
- sysUploadDao.updateById(sysUploadEntity);
|
|
|
+ // - 否
|
|
|
+ // [方法] 上传事件
|
|
|
+ SysUpload sysUploadEntity = uploadEvent(multipartFile, category_id, target);
|
|
|
+ return sysUploadEntity;
|
|
|
}
|
|
|
- return sysUploadEntity;
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
throw new RuntimeException(e);
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|