package com.fdkankan.scene.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.constant.RecStatus; import com.fdkankan.common.constant.ServerCode; import com.fdkankan.common.util.FileUtils; import com.fdkankan.model.constants.ConstantFilePath; import com.fdkankan.model.constants.UploadFilePath; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.scene.oss.OssUtil; import com.fdkankan.web.response.ResultData; import com.fdkankan.web.util.BASE64DecodedMultipartFile; import com.fdkankan.scene.entity.ScenePlus; import com.fdkankan.scene.entity.ScenePlusExt; import com.fdkankan.scene.entity.SceneUpload; import com.fdkankan.scene.mapper.ISceneUploadMapper; import com.fdkankan.scene.service.IScenePlusExtService; import com.fdkankan.scene.service.IScenePlusService; import com.fdkankan.scene.service.ISceneUploadService; import com.fdkankan.scene.vo.DeleteFileParamVO; import com.fdkankan.scene.vo.UploadContentParamVO; import com.fdkankan.web.user.SSOLoginHelper; import com.fdkankan.web.user.SSOUser; import java.io.File; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.UUID; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; 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; /** *

* 服务实现类 *

* * @author * @since 2022-01-19 */ @Slf4j @Service public class SceneUploadServiceImpl extends ServiceImpl implements ISceneUploadService { @Resource @Autowired private SSOLoginHelper ssoLoginHelper; @Autowired private IScenePlusService scenePlusService; @Autowired private IScenePlusExtService scenePlusExtService; @Autowired private OssUtil ossUtil; @Override public String uploads(String imgData,String fileName,String blzType,MultipartFile[] files, String sceneCode,Integer type,String token, String uploadPath) throws Exception{ SSOUser ssoUser = ssoLoginHelper.loginCheck(token); Long userId = ssoUser == null ? null :ssoUser.getId(); List multipartFiles = new ArrayList<>(); if(StringUtils.isNotBlank(imgData)){ MultipartFile file = BASE64DecodedMultipartFile.base64ToMultipart(imgData); multipartFiles.add(file); } if(files !=null && files.length >0){ multipartFiles.addAll(Arrays.asList(files)); } return this.uploadFiles(fileName,blzType,multipartFiles,sceneCode,type,userId,uploadPath); } @Override public ResultData delete(DeleteFileParamVO param) throws Exception { ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum()); if(Objects.isNull(scenePlus)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); String bucket = scenePlusExt.getYunFileBucket(); String userEditPath = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()); List filePaths = new ArrayList<>(); Set hasDelete = new HashSet<>(); for (String fileName : param.getFileNames()) { if(hasDelete.contains(fileName)){ continue; } hasDelete.add(fileName); String key = userEditPath + fileName; filePaths.add(key); ossUtil.deleteObject(bucket, key); } this.update(new LambdaUpdateWrapper() .set(SceneUpload::getRecStatus, RecStatus.DISABLE.code()) .eq(SceneUpload::getNum, param.getNum()) .eq(SceneUpload::getBizType, param.getBizType()) .in(SceneUpload::getFilePath, filePaths)); return ResultData.ok(); } public String uploadFiles(String sendFileName,String bizType,List files, String num, Integer type,Long userId, String uploadPath) throws Exception{ if (StrUtil.isEmpty(num)) throw new BusinessException(ServerCode.PARAM_REQUIRED, "num"); if(CollUtil.isEmpty(files)) throw new BusinessException(ServerCode.PARAM_REQUIRED, "files"); if(StrUtil.isEmpty(bizType)) throw new BusinessException(ServerCode.PARAM_REQUIRED, "bizType"); ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.isNull(scenePlus)) throw new BusinessException(ErrorCode.FAILURE_CODE_5005); ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); String bucket = scenePlusExt.getYunFileBucket(); List urlList = new ArrayList<>(); if(type != null && 1 == type){ this.updateFileByPreFix(num,bizType,bucket); } for (MultipartFile file : files) { String fileName = file.getOriginalFilename(); // 获取文件后缀 String prefix = fileName.substring(fileName.lastIndexOf(".")); String path = String.format(ConstantFilePath.SCENE_TMP_PATH_V4, num).concat(UUID.randomUUID().toString()).concat(prefix); // File newFile = File.createTempFile(UUID.randomUUID().toString() ,prefix); FileUtil.mkParentDirs(path); file.transferTo(new File(path)); String realFileName = fileName; if(files.size() ==1 && StringUtils.isNotBlank(sendFileName)){ realFileName = sendFileName ; } String oldExtName = cn.hutool.core.io.FileUtil.extName(realFileName); String newExtName = oldExtName.toLowerCase(); realFileName = realFileName.substring(0, realFileName.lastIndexOf(oldExtName)) + newExtName; String ossPath = StrUtil.isNotBlank(uploadPath) ? uploadPath : (String.format(UploadFilePath.USER_EDIT_PATH ,num) + realFileName); try { ossUtil.uploadFile(bucket, ossPath, newFile.getPath(), false); }catch (Exception e){ log.error(ossPath+"上传文件失败"+e); throw new BusinessException(ErrorCode.FAILURE_CODE_7013); } urlList.add(realFileName); try{ newFile.delete(); }catch (Exception e){ log.warn("delete tempFile error ,===="+newFile.getAbsoluteFile()); } //添加记录 this.saveData(num,ossPath,bizType,userId); } StringBuilder returnString = new StringBuilder(); for (String res : urlList) { if(StringUtils.isNotBlank(returnString)){ returnString.append(","); } returnString.append(res); } return returnString.toString(); } private void updateFileByPreFix(String sceneCode, String blzType, String bucket) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SceneUpload::getNum,sceneCode) .eq(SceneUpload::getBizType,blzType); List list = this.list(queryWrapper); if(list != null && list.size() >0){ for (SceneUpload sceneUpload : list) { try { ossUtil.deleteObject(bucket, sceneUpload.getFilePath()); this.removeEntity(sceneUpload); }catch (Exception e){ log.error(sceneUpload.getFilePath()+"删除oss文件失败",e); } } } } private void removeEntity(SceneUpload sceneUpload) { sceneUpload.setRecStatus(RecStatus.VALID.code()); this.updateById(sceneUpload); } private void saveData(String sceneCode, String ossPath, String bizType,Long userId) { SceneUpload sceneUpload = new SceneUpload(); sceneUpload.setNum(sceneCode); sceneUpload.setFilePath(ossPath); sceneUpload.setBizType(bizType); sceneUpload.setUploadUser(userId); this.save(sceneUpload); } // @Override // public String uploadContent(UploadContentParamVO param) throws Exception { // // String ossPath = param.getOssPath(); // String fileName = ossPath.substring(ossPath.lastIndexOf("/") + 1); // if(StrUtil.isEmpty(fileName)){ // throw new BusinessException(ErrorCode.FAILURE_CODE_7012); // } // String suffix = fileName.substring(fileName.lastIndexOf(".")); // if(StrUtil.isEmpty(suffix)){ // throw new BusinessException(ErrorCode.FAILURE_CODE_7012); // } // // File tempFile = File.createTempFile(UUID.randomUUID().toString(), suffix); // cn.hutool.core.io.FileUtil.writeString(param.getContent(), tempFile, StandardCharsets.UTF_8); // fYunFileService.uploadFile(param.getBucket(), tempFile.getPath(), param.getOssPath()); // tempFile.deleteOnExit(); // // return this.ossUrlPrefix + param.getOssPath(); // } }