diff --git a/eladmin-common/src/main/java/me/zhengjie/common/http/CommonResponse.java b/eladmin-common/src/main/java/me/zhengjie/common/http/CommonResponse.java index 85a37eb..7316a5f 100644 --- a/eladmin-common/src/main/java/me/zhengjie/common/http/CommonResponse.java +++ b/eladmin-common/src/main/java/me/zhengjie/common/http/CommonResponse.java @@ -67,6 +67,11 @@ public class CommonResponse implements Serializable { return new CommonResponse(ResponseCode.SUCCESS.getCode(), data); } + //返回错误码和错误描述 + public static CommonResponse createBySuccessByCode(ResponseCode responseCode){ + return new CommonResponse(responseCode.getCode(),responseCode.getDesc()); + } + //返回成功码和成功信息和数据 public static CommonResponse createBySuccess(String msg, T data) { return new CommonResponse(ResponseCode.SUCCESS.getCode(), msg, data); diff --git a/eladmin-common/src/main/java/me/zhengjie/common/http/ResponseCode.java b/eladmin-common/src/main/java/me/zhengjie/common/http/ResponseCode.java index 1bd3226..370e385 100644 --- a/eladmin-common/src/main/java/me/zhengjie/common/http/ResponseCode.java +++ b/eladmin-common/src/main/java/me/zhengjie/common/http/ResponseCode.java @@ -14,6 +14,8 @@ public enum ResponseCode { SUCCESS(0,"SUCCESS"), ERROR(1,"ERROR"), + // 成功的一些特殊提示 + SUCCESS_ONCE_LINK_MSG(0,"下载成功,一次性链接已经失效"), // 通用请求参数校验 ILLEGAL_ARGUMENT(1,"请求参数格式错误"), EMPTY_ARGUMENT(1,"请求参数为空"), @@ -21,6 +23,7 @@ public enum ResponseCode { NO_FILE_INPUT(1,"没有文件输入"), // 特殊需要进行前端返回说明的参数定义 TASK_NAME_IS_EXIST(1,"任务名称已经存在"), + ONCE_LINK_MSG_ERROR(1,"链接失效,下载文件失败~"), // 请求结果性的错误 NODATA_ERROR(1,"查询结果为空"), TASK_BUILD_ERROR(1,"任务建立失败"), diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/rest/MailTaskController.java b/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/rest/MailTaskController.java index 626ee6b..65191e9 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/rest/MailTaskController.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/rest/MailTaskController.java @@ -1,18 +1,15 @@ package me.zhengjie.modules.mailtask.rest; -import cn.hutool.json.JSON; -import cn.hutool.json.JSONUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import me.zhengjie.annotation.AnonymousAccess; import me.zhengjie.annotation.Log; import me.zhengjie.common.http.CommonResponse; import me.zhengjie.common.http.ResponseCode; import me.zhengjie.common.json.OnceLinkMsgJsonContent; import me.zhengjie.modules.mailtask.service.MailTaskService; -import me.zhengjie.modules.tmpfilerecord.service.TempFileRecordService; import me.zhengjie.utils.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -31,15 +28,13 @@ public class MailTaskController { private final MailTaskService mailTaskService; - @Autowired - private TempFileRecordService tempFileRecordService; - /** * 上传多个文件, 返回一个一次性链接 */ @Log("生成文件一次性链接") @PostMapping("link") @ApiOperation("生成一次性链接") + @AnonymousAccess // fixme 需要测试完成后进行去除和使用上面的权限注解 public ResponseEntity buildRequest(@RequestParam(value = "files") MultipartFile[] files){ // 校验上传是否有文件 if (files!= null && files.length<= 0){ @@ -47,15 +42,10 @@ public class MailTaskController { } // 构建一次性链接 String result = mailTaskService.buildOnceLinkForInputFile(files); -// String jsonResult = null; OnceLinkMsgJsonContent content = new OnceLinkMsgJsonContent(); if (StringUtils.isNotBlank(result)){ // 进行json相关的转换 content.setOnceLink(result); -// JSON parse = JSONUtil.parse(content); -//// if (parse != null){ -//// jsonResult = JSONUtil.toJsonStr(parse); -//// } }else { return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.NO_MATCH_ARGUMENT_SET), HttpStatus.OK); } @@ -69,12 +59,17 @@ public class MailTaskController { @Log("下载文件") @GetMapping("download") @ApiOperation("下载文件") - public ResponseEntity downLoadFile(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "rand")String rand){ + @AnonymousAccess // fixme 需要测试完成后进行去除和使用上面的权限注解 + public void downLoadOnceFile(HttpServletResponse response, HttpServletRequest request, @RequestParam(value = "rand")String rand){ // 校验参数,进行下载文件 - if (StringUtils.isBlank(rand)){ +/* if (StringUtils.isBlank(rand)){ return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.EMPTY_ARGUMENT), HttpStatus.OK); - } - mailTaskService.downloadFilesByRandCode(rand, response, request); - return new ResponseEntity<>(CommonResponse.createBySuccess(), HttpStatus.OK); + }*/ + Boolean tag = mailTaskService.downloadFilesByRandCode(rand, response, request); +/* if (tag){ + return new ResponseEntity<>(CommonResponse.createBySuccessByCode(ResponseCode.SUCCESS_ONCE_LINK_MSG), HttpStatus.OK); + }else { + return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.ONCE_LINK_MSG_ERROR), HttpStatus.OK); + }*/ } } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/MailTaskService.java b/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/MailTaskService.java index 7f79939..badd417 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/MailTaskService.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/MailTaskService.java @@ -1,5 +1,6 @@ package me.zhengjie.modules.mailtask.service; +import com.sun.org.apache.xpath.internal.operations.Bool; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; @@ -21,5 +22,5 @@ public interface MailTaskService { * * @param rand 验证下载码 */ - void downloadFilesByRandCode(String rand, HttpServletResponse response, HttpServletRequest request); + Boolean downloadFilesByRandCode(String rand, HttpServletResponse response, HttpServletRequest request); } diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/impl/MailTaskServiceImpl.java b/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/impl/MailTaskServiceImpl.java index 6a056ae..2913f2d 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/impl/MailTaskServiceImpl.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/mailtask/service/impl/MailTaskServiceImpl.java @@ -1,16 +1,19 @@ package me.zhengjie.modules.mailtask.service.impl; import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.ZipUtil; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.system.OsInfo; import cn.hutool.system.SystemUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import me.zhengjie.exception.BadRequestException; import me.zhengjie.modules.mailtask.service.MailTaskService; import me.zhengjie.modules.tmpfilerecord.domain.TempFileRecord; import me.zhengjie.modules.tmpfilerecord.service.TempFileRecordService; import me.zhengjie.modules.tmpfilerecord.service.dto.TempFileRecordDto; import me.zhengjie.utils.FileUtil; +import me.zhengjie.utils.GenUtil; import me.zhengjie.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -22,7 +25,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; +import java.nio.file.FileSystem; import java.nio.file.Paths; import java.util.List; @@ -41,6 +46,17 @@ public class MailTaskServiceImpl implements MailTaskService { */ private static final String FILE_SPLIT = ","; + /** + * 完成建立的文件状态码 + */ + private static final int FINISH_BUILD_FILE_STATUS_CODE = 0; + + /** + * 成功进行下载的文件状态码 + */ + private static final int FINISH_DOWNLOAD_FILE_STATUS_CODE = 1; + + /** * 远程服务器地址 */ @@ -74,9 +90,10 @@ public class MailTaskServiceImpl implements MailTaskService { // 路径build StringBuilder pathBuilder = new StringBuilder(); - + // 生成通用随机文件夹存放每次的文件 + String baseStr = RandomUtil.randomString(11) + File.separator; for (MultipartFile file : files) { - String eachFilePath = buildFileWritePath(); + String eachFilePath = buildFileWritePath(baseStr); pathBuilder.append(eachFilePath); pathBuilder.append(FILE_SPLIT); if (StringUtils.isBlank(eachFilePath)){ @@ -98,7 +115,7 @@ public class MailTaskServiceImpl implements MailTaskService { // 生成验证码 tempFileRecord.setVerificationCode(RandomUtil.randomString(11)); // 文件标记 - 生成但是未读 - tempFileRecord.setFileStatus(0); + tempFileRecord.setFileStatus(FINISH_BUILD_FILE_STATUS_CODE); TempFileRecordDto tempFileRecordDto = tempFileRecordService.create(tempFileRecord); if (tempFileRecordDto == null){ log.error(" ====== [ create TempFileRecordDto fail, please check it. tempFileRecord is {} ] =====", tempFileRecord.toString()); @@ -116,21 +133,22 @@ public class MailTaskServiceImpl implements MailTaskService { /** * 构建文件上传保存路径 */ - private String buildFileWritePath(){ + private String buildFileWritePath(String baseStr){ // 获取环境配置信息 OsInfo osInfo = SystemUtil.getOsInfo(); + // 生成一个随机文件夹目录,方便整理和打包 if (osInfo.isWindows()){ - FileUtil.mkdir(remoteLinkFileBasePathWindows); + FileUtil.mkdir(remoteLinkFileBasePathWindows + baseStr); // 构建存储文件 - return remoteLinkFileBasePathWindows + RandomUtil.randomString(11) + FILE_END; + return remoteLinkFileBasePathWindows + baseStr + RandomUtil.randomString(11) + FILE_END; }else if (osInfo.isLinux()){ - FileUtil.mkdir(remoteLinkFileBasePathLinux); + FileUtil.mkdir(remoteLinkFileBasePathLinux + baseStr); // 构建存储文件 - return remoteLinkFileBasePathLinux + RandomUtil.randomString(11) + FILE_END; + return remoteLinkFileBasePathLinux + baseStr + RandomUtil.randomString(11) + FILE_END; }else if (osInfo.isMac()){ - FileUtil.mkdir(remoteLinkFileBasePathMac); + FileUtil.mkdir(remoteLinkFileBasePathMac + baseStr); // 构建存储文件 - return remoteLinkFileBasePathMac + RandomUtil.randomString(11) + FILE_END; + return remoteLinkFileBasePathMac + baseStr + RandomUtil.randomString(11) + FILE_END; }else { return ""; } @@ -138,22 +156,26 @@ public class MailTaskServiceImpl implements MailTaskService { @Override @Transactional(rollbackFor = Exception.class) - public void downloadFilesByRandCode(String rand, HttpServletResponse response,HttpServletRequest request) { + public Boolean downloadFilesByRandCode(String rand, HttpServletResponse response,HttpServletRequest request) { // 根据验证码查出需要的信息 - TempFileRecord tempFileRecord = tempFileRecordService.findByVerificationCode(rand.trim()); + TempFileRecord tempFileRecord = tempFileRecordService.findByVerificationCode(rand.trim(), FINISH_BUILD_FILE_STATUS_CODE); // 切分需要的文件地址 if (tempFileRecord!= null){ String filePaths = tempFileRecord.getFilePaths(); if (StringUtils.isNotBlank(filePaths)){ String[] split = filePaths.split(FILE_SPLIT); - if (split.length > 0){ - for (String eachPath : split) { - // 每天一个文件写入要下载的请求中 - File file = new File(eachPath); - FileUtil.downloadFile(request, response, file, false); - } + if (split.length > 0 && StringUtils.isNotBlank(split[0])){ + String tempPath = StringUtils.substringBeforeLast(split[0], File.separator); + String zipPath = tempPath + ".zip"; + ZipUtil.zip(tempPath, zipPath); + FileUtil.downloadFile(request, response, new File(zipPath), true); + // 更新下载结果 + tempFileRecord.setFileStatus(FINISH_DOWNLOAD_FILE_STATUS_CODE); + tempFileRecordService.update(tempFileRecord); } } + return Boolean.TRUE; } + return Boolean.FALSE; } } diff --git a/READ_OPRATION.md b/eladmin-system/src/main/resources/config/READ_OPRATION.md similarity index 100% rename from READ_OPRATION.md rename to eladmin-system/src/main/resources/config/READ_OPRATION.md diff --git a/eladmin-system/src/main/resources/config/application.yml b/eladmin-system/src/main/resources/config/application.yml index 793279d..a99ee5b 100644 --- a/eladmin-system/src/main/resources/config/application.yml +++ b/eladmin-system/src/main/resources/config/application.yml @@ -5,7 +5,7 @@ spring: freemarker: check-template-location: false profiles: - active: prod + active: dev jackson: time-zone: GMT+8 data: