From 1c31a72a5ec0d5f5890f80b8ea74074b66fcdf4a Mon Sep 17 00:00:00 2001 From: liyating <2435065796@qq.com> Date: Tue, 12 Apr 2022 14:25:41 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=88=20perf(=E6=89=B9=E9=87=8F=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD):=20=E6=94=B9=E4=B8=BA=E6=89=93=E5=8C=85=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E4=B8=BA=20zip=20=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/api/IFiletransferService.java | 2 +- .../controller/FiletransferController.java | 44 ++++++++++++++----- .../file/dto/file/BatchDownloadFileDTO.java | 2 +- .../file/service/FiletransferService.java | 9 ++-- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/qiwenshare/file/api/IFiletransferService.java b/src/main/java/com/qiwenshare/file/api/IFiletransferService.java index 8315da7..5f1ec9f 100644 --- a/src/main/java/com/qiwenshare/file/api/IFiletransferService.java +++ b/src/main/java/com/qiwenshare/file/api/IFiletransferService.java @@ -18,7 +18,7 @@ public interface IFiletransferService { void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId); void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO); - void downloadUserFileList(HttpServletResponse httpServletResponse, String filePath, String fileName, List userFileList); + void downloadUserFileList(HttpServletResponse httpServletResponse, String filePath, String fileName, List userFileIds); void previewFile(HttpServletResponse httpServletResponse, PreviewDTO previewDTO); void previewPictureFile(HttpServletResponse httpServletResponse, PreviewDTO previewDTO); void deleteFile(FileBean fileBean); diff --git a/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index 4f7d8de..f3aa84e 100644 --- a/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -1,6 +1,7 @@ package com.qiwenshare.file.controller; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.qiwenshare.common.anno.MyLog; import com.qiwenshare.common.result.RestResult; import com.qiwenshare.common.util.DateUtil; @@ -16,6 +17,7 @@ import com.qiwenshare.file.dto.file.BatchDeleteFileDTO; import com.qiwenshare.file.dto.file.DownloadFileDTO; import com.qiwenshare.file.dto.file.PreviewDTO; import com.qiwenshare.file.dto.file.UploadFileDTO; +import com.qiwenshare.file.dto.file.BatchDownloadFileDTO; import com.qiwenshare.file.mapper.ImageMapper; import com.qiwenshare.file.service.StorageService; import com.qiwenshare.file.vo.file.UploadFileVo; @@ -39,6 +41,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.List; +import java.util.ArrayList; +import java.util.Date; +import java.util.stream.Collectors; @Slf4j @Tag(name = "filetransfer", description = "该接口为文件传输接口,主要用来做文件的上传、下载和预览") @@ -146,22 +151,37 @@ public class FiletransferController { } @Operation(summary = "批量下载文件", description = "批量下载文件", tags = {"filetransfer"}) - @RequestMapping(value = "/batchdeletefile", method = RequestMethod.POST) - @MyLog(operation = "批量删除文件", module = CURRENT_MODULE) + @RequestMapping(value = "/batchDownloadFile", method = RequestMethod.GET) + @MyLog(operation = "批量下载文件", module = CURRENT_MODULE) @ResponseBody - public RestResult batchDownloadFile(HttpServletResponse httpServletResponse, @RequestBody BatchDeleteFileDTO batchDeleteFileDto) { + public void batchDownloadFile(HttpServletResponse httpServletResponse, BatchDownloadFileDTO batchDownloadFileDTO) { - List userFiles = JSON.parseArray(batchDeleteFileDto.getFiles(), UserFile.class); - if (userFiles == null || userFiles.isEmpty()) { - return RestResult.fail().message("文件列表为空!"); + String files = batchDownloadFileDTO.getUserFileIds(); + String[] userFileIdStrs = files.split(","); + List userFileIds = new ArrayList<>(); + for(String userFileIdStr : userFileIdStrs) { + Long userFileId = Long.parseLong(userFileIdStr); + UserFile userFile = userFileService.getById(userFileId); + if (userFile.getIsDir() == 0) { + userFileIds.add(userFileId); + } else { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.likeRight(UserFile::getFilePath, userFile.getFilePath() + userFile.getFileName() + "/") + .eq(UserFile::getUserId, userFile.getUserId()) + .eq(UserFile::getIsDir, 0) + .eq(UserFile::getDeleteFlag, 0); + List userFileList = userFileService.list(lambdaQueryWrapper); + List userFileIds1 = userFileList.stream().map(UserFile::getUserFileId).collect(Collectors.toList()); + userFileIds.addAll(userFileIds1); + } + } - UserFile userFile = userFileService.getById(userFiles.get(0).getUserFileId()); + UserFile userFile = userFileService.getById(userFileIds.get(0)); httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开 - String fileName = DateUtil.getCurrentTime(); - httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 - filetransferService.downloadUserFileList(httpServletResponse, userFile.getFilePath(), fileName, userFiles); - - return RestResult.success().message("批量下载文件成功"); + Date date = new Date(); + String fileName = String.valueOf(date.getTime()); + httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName + ".zip");// 设置文件名 + filetransferService.downloadUserFileList(httpServletResponse, userFile.getFilePath(), fileName, userFileIds); } @Operation(summary="预览文件", description="用于文件预览", tags = {"filetransfer"}) diff --git a/src/main/java/com/qiwenshare/file/dto/file/BatchDownloadFileDTO.java b/src/main/java/com/qiwenshare/file/dto/file/BatchDownloadFileDTO.java index 6af80f9..c4f92bf 100644 --- a/src/main/java/com/qiwenshare/file/dto/file/BatchDownloadFileDTO.java +++ b/src/main/java/com/qiwenshare/file/dto/file/BatchDownloadFileDTO.java @@ -7,6 +7,6 @@ import lombok.Data; @Schema(name = "批量下载文件DTO",required = true) public class BatchDownloadFileDTO { @Schema(description="文件集合", required = true) - private String files; + private String userFileIds; } diff --git a/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/src/main/java/com/qiwenshare/file/service/FiletransferService.java index e8c2e4c..5cb6417 100644 --- a/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -48,6 +48,7 @@ import java.util.zip.Adler32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import java.util.stream.Collectors; @Slf4j @Service @@ -289,13 +290,14 @@ public class FiletransferService implements IFiletransferService { .eq(UserFile::getIsDir, 0) .eq(UserFile::getDeleteFlag, 0); List userFileList = userFileMapper.selectList(lambdaQueryWrapper); + List userFileIds = userFileList.stream().map(UserFile::getUserFileId).collect(Collectors.toList()); - downloadUserFileList(httpServletResponse, userFile.getFilePath(), userFile.getFileName(), userFileList); + downloadUserFileList(httpServletResponse, userFile.getFilePath(), userFile.getFileName(), userFileIds); } } @Override - public void downloadUserFileList(HttpServletResponse httpServletResponse, String filePath, String fileName, List userFileList) { + public void downloadUserFileList(HttpServletResponse httpServletResponse, String filePath, String fileName, List userFileIds) { String staticPath = UFOPUtils.getStaticPath(); String tempPath = staticPath + "temp" + File.separator; File tempDirFile = new File(tempPath); @@ -314,7 +316,8 @@ public class FiletransferService implements IFiletransferService { BufferedOutputStream out = new BufferedOutputStream(zos); try { - for (UserFile userFile1 : userFileList) { + for (Long userFileId : userFileIds) { + UserFile userFile1 = userFileMapper.selectById(userFileId); FileBean fileBean = fileMapper.selectById(userFile1.getFileId()); Downloader downloader = ufopFactory.getDownloader(fileBean.getStorageType()); if (downloader == null) {