diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java index 7620ea6..2661666 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/AliyunOSSUploaderFactory.java @@ -4,9 +4,14 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.AliyunOSSUploader; import com.qiwenshare.common.upload.Uploader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; +@Component public class AliyunOSSUploaderFactory implements UploaderFactory { + @Override public Uploader getUploader() { return new AliyunOSSUploader(); @@ -17,8 +22,4 @@ public class AliyunOSSUploaderFactory implements UploaderFactory { return new AliyunOSSUploader(uploadFile); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return null; - } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java index 228b4a7..830104a 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/ChunkUploaderFactory.java @@ -4,7 +4,11 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.ChunkUploader; import com.qiwenshare.common.upload.Uploader; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class ChunkUploaderFactory implements UploaderFactory { @Override @@ -17,10 +21,5 @@ public class ChunkUploaderFactory implements UploaderFactory { return new ChunkUploader(uploadFile); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return null; - } - } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java index 439e474..5e6a80f 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/FastDFSUploaderFactory.java @@ -4,8 +4,15 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.upload.product.FastDFSUploader; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class FastDFSUploaderFactory implements UploaderFactory { + + @Resource + AppendFileStorageClient defaultAppendFileStorageClient; @Override public Uploader getUploader() { return new FastDFSUploader(); @@ -13,11 +20,7 @@ public class FastDFSUploaderFactory implements UploaderFactory { @Override public Uploader getUploader(UploadFile uploadFile) { - return new FastDFSUploader(uploadFile); + return new FastDFSUploader(uploadFile, defaultAppendFileStorageClient); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return new FastDFSUploader(uploadFile, appendFileStorageClient); - } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java index 349b66e..145dfa7 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/NormalUploaderFactory.java @@ -4,7 +4,11 @@ import com.github.tobato.fastdfs.service.AppendFileStorageClient; import com.qiwenshare.common.domain.UploadFile; import com.qiwenshare.common.upload.product.NormalUploader; import com.qiwenshare.common.upload.Uploader; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; + +@Component public class NormalUploaderFactory implements UploaderFactory { @Override @@ -17,8 +21,4 @@ public class NormalUploaderFactory implements UploaderFactory { return new NormalUploader(); } - @Override - public Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient) { - return null; - } } diff --git a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java index f48a550..99a4793 100644 --- a/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java +++ b/file-common/src/main/java/com/qiwenshare/common/upload/factory/UploaderFactory.java @@ -7,5 +7,4 @@ import com.qiwenshare.common.upload.Uploader; public interface UploaderFactory { Uploader getUploader(); Uploader getUploader(UploadFile uploadFile); - Uploader getUploader(UploadFile uploadFile, AppendFileStorageClient appendFileStorageClient); } diff --git a/file-web/src/main/java/com/qiwenshare/file/FileApplication.java b/file-web/src/main/java/com/qiwenshare/file/FileApplication.java index 1c7bc5b..bb625b1 100644 --- a/file-web/src/main/java/com/qiwenshare/file/FileApplication.java +++ b/file-web/src/main/java/com/qiwenshare/file/FileApplication.java @@ -3,6 +3,8 @@ package com.qiwenshare.file; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -11,6 +13,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableScheduling //@EnableDiscoveryClient @EnableTransactionManagement +@ComponentScan(value = "com.qiwenshare", excludeFilters = @ComponentScan.Filter( + type = FilterType.ASSIGNABLE_TYPE, + classes = { + } +)) public class FileApplication { public static void main(String[] args) { diff --git a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java index ff229b3..cca748c 100644 --- a/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java +++ b/file-web/src/main/java/com/qiwenshare/file/controller/FiletransferController.java @@ -1,8 +1,13 @@ package com.qiwenshare.file.controller; +import com.aliyun.oss.OSS; +import com.aliyun.oss.model.OSSObject; import com.qiwenshare.common.cbb.DateUtil; +import com.qiwenshare.common.operation.FileOperation; +import com.qiwenshare.common.oss.AliyunOSSDownload; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.common.cbb.RestResult; +import com.qiwenshare.common.util.PathUtil; import com.qiwenshare.file.anno.MyLog; import com.qiwenshare.file.api.IFileService; import com.qiwenshare.file.api.IFiletransferService; @@ -13,6 +18,7 @@ import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.StorageBean; import com.qiwenshare.file.domain.UserBean; import com.qiwenshare.file.domain.UserFile; +import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.vo.file.UploadFileVo; import io.swagger.v3.oas.annotations.Operation; @@ -22,6 +28,8 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -120,6 +128,86 @@ public class FiletransferController { } + /** + * 下载文件 + * + * @return + */ + @Operation(summary = "下载文件", description = "下载文件接口", tags = {"filetransfer"}) + @MyLog(operation = "下载文件", module = CURRENT_MODULE) + @RequestMapping(value = "/downloadfile", method = RequestMethod.GET) + public String downloadFile(HttpServletResponse response, DownloadFileDTO downloadFileDTO) { + UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId()); + + String fileName = userFile.getFileName() + "." + userFile.getExtendName(); + response.setContentType("application/force-download");// 设置强制下载不打开 + response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名 + byte[] buffer = new byte[1024]; + BufferedInputStream bis = null; + FileBean fileBean = fileService.getById(userFile.getFileId()); + if (fileBean.getIsOSS() != null && fileBean.getIsOSS() == 1) { + + AliyunOSSDownload aliyunOSSDownload= new AliyunOSSDownload(); + OSS ossClient = aliyunOSSDownload.createOSSClient(qiwenFileConfig.getAliyun().getOss()); + OSSObject ossObject = ossClient.getObject(qiwenFileConfig.getAliyun().getOss().getBucketName(), fileBean.getTimeStampName()); + InputStream inputStream = ossObject.getObjectContent(); + try { + bis = new BufferedInputStream(inputStream); + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + ossClient.shutdown(); + } else { + //设置文件路径 + File file = FileOperation.newFile(PathUtil.getStaticPath() + fileBean.getFileUrl()); + if (file.exists()) { + + + FileInputStream fis = null; + + try { + fis = new FileInputStream(file); + bis = new BufferedInputStream(fis); + OutputStream os = response.getOutputStream(); + int i = bis.read(buffer); + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + } + return null; + + } + @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"}) @RequestMapping(value = "/getstorage", method = RequestMethod.GET) @ResponseBody diff --git a/file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java b/file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java new file mode 100644 index 0000000..83c7ae9 --- /dev/null +++ b/file-web/src/main/java/com/qiwenshare/file/dto/DownloadFileDTO.java @@ -0,0 +1,10 @@ +package com.qiwenshare.file.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(name = "下载文件DTO",required = true) +public class DownloadFileDTO { + private Long userFileId; +} diff --git a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java index e2ed934..aa8aead 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/FiletransferService.java @@ -15,6 +15,7 @@ import com.qiwenshare.common.upload.factory.AliyunOSSUploaderFactory; import com.qiwenshare.common.upload.factory.ChunkUploaderFactory; import com.qiwenshare.common.upload.Uploader; import com.qiwenshare.common.upload.factory.FastDFSUploaderFactory; +import com.qiwenshare.common.upload.factory.UploaderFactory; import com.qiwenshare.file.api.IFiletransferService; import com.qiwenshare.common.domain.AliyunOSS; @@ -41,8 +42,13 @@ public class FiletransferService implements IFiletransferService { QiwenFileConfig qiwenFileConfig; @Resource UserFileMapper userFileMapper; + @Resource - AppendFileStorageClient defaultAppendFileStorageClient; + UploaderFactory fastDFSUploaderFactory; + @Resource + UploaderFactory aliyunOSSUploaderFactory; + @Resource + UploaderFactory chunkUploaderFactory; @@ -61,11 +67,11 @@ public class FiletransferService implements IFiletransferService { uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); synchronized (FiletransferService.class) { if (oss.isEnabled()) { - uploader = new AliyunOSSUploaderFactory().getUploader(uploadFile); + uploader = aliyunOSSUploaderFactory.getUploader(uploadFile); } else if ("FastFDS".equals(storyType)) { - uploader = new FastDFSUploaderFactory().getUploader(uploadFile, defaultAppendFileStorageClient); + uploader = fastDFSUploaderFactory.getUploader(uploadFile); } else { - uploader = new ChunkUploaderFactory().getUploader(uploadFile); + uploader = chunkUploaderFactory.getUploader(uploadFile); } } diff --git a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java index b499df9..859c7b8 100644 --- a/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java +++ b/file-web/src/main/java/com/qiwenshare/file/service/RecoveryFileService.java @@ -59,65 +59,65 @@ public class RecoveryFileService extends ServiceImpl userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); -// userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 0) -// .set(UserFile::getDeleteBatchNum, "") -// .eq(UserFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum()); -// userFileService.update(userFileLambdaUpdateWrapper); -// -// String filePath = PathUtil.getParentPath(restoreFileDto.getFilePath()); -// while(filePath.indexOf("/") != -1) { -// String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); -// filePath = PathUtil.getParentPath(filePath); -// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// lambdaQueryWrapper.eq(UserFile::getFilePath, filePath + "/") -// .eq(UserFile::getDeleteFlag, 0) -// .eq(UserFile::getUserId, sessionUserBean.getUserId()); -// List userFileList = userFileService.list(lambdaQueryWrapper); -// if (userFileList.size() == 0) { -// UserFile userFile = new UserFile(); -// userFile.setUserId(sessionUserBean.getUserId()); -// userFile.setFileName(fileName); -// userFile.setFilePath(filePath + "/"); -// userFile.setDeleteFlag(0); -// userFile.setIsDir(1); -// userFile.setUploadTime(DateUtil.getCurrentTime()); -// -// userFileService.save(userFile); -// } -// -// } -// -// LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); -// -// lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath) -// .likeRight(UserFile::getFilePath, restoreFileDto.getFilePath()) -// .eq(UserFile::getIsDir, 1) -// .eq(UserFile::getDeleteFlag, 0) -// .groupBy(UserFile::getFilePath, UserFile::getFileName) -// .having("count(fileName) >= 2"); -// List repeatList = userFileService.list(lambdaQueryWrapper); -// -// for (UserFile userFile : repeatList) { -// LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); -// lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath()) -// .eq(UserFile::getFileName, userFile.getFileName()) -// .eq(UserFile::getDeleteFlag, "0"); -// List userFiles = userFileService.list(lambdaQueryWrapper1); -// log.info("重复的文件:" + JSON.toJSONString(userFiles)); -// for (int i = 0; i < userFiles.size() - 1; i ++) { -// log.info("删除文件:" + JSON.toJSONString(userFiles.get(i))); -// userFileService.removeById(userFiles.get(i).getUserFileId()); -// } -// } -// -// log.info(JSON.toJSONString(repeatList)); -// -// LambdaQueryWrapper recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>(); -// recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum()); -// recoveryFileService.remove(recoveryFileServiceLambdaQueryWrapper); -// } + public void restorefile(String deleteBatchNum, String filePath, Long sessionUserId) { + LambdaUpdateWrapper userFileLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + userFileLambdaUpdateWrapper.set(UserFile::getDeleteFlag, 0) + .set(UserFile::getDeleteBatchNum, "") + .eq(UserFile::getDeleteBatchNum, deleteBatchNum); + userFileMapper.update(null, userFileLambdaUpdateWrapper); + + String parentFilePath = PathUtil.getParentPath(filePath); + while(parentFilePath.indexOf("/") != -1) { + String fileName = parentFilePath.substring(parentFilePath.lastIndexOf("/") + 1); + parentFilePath = PathUtil.getParentPath(parentFilePath); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(UserFile::getFilePath, parentFilePath + "/") + .eq(UserFile::getDeleteFlag, 0) + .eq(UserFile::getUserId, sessionUserId); + List userFileList = userFileMapper.selectList(lambdaQueryWrapper); + if (userFileList.size() == 0) { + UserFile userFile = new UserFile(); + userFile.setUserId(sessionUserId); + userFile.setFileName(fileName); + userFile.setFilePath(parentFilePath + "/"); + userFile.setDeleteFlag(0); + userFile.setIsDir(1); + userFile.setUploadTime(DateUtil.getCurrentTime()); + + userFileMapper.insert(userFile); + } + + } + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + + lambdaQueryWrapper.select(UserFile::getFileName, UserFile::getFilePath) + .likeRight(UserFile::getFilePath, filePath) + .eq(UserFile::getIsDir, 1) + .eq(UserFile::getDeleteFlag, 0) + .groupBy(UserFile::getFilePath, UserFile::getFileName) + .having("count(fileName) >= 2"); + List repeatList = userFileMapper.selectList(lambdaQueryWrapper); + + for (UserFile userFile : repeatList) { + LambdaQueryWrapper lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); + lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath()) + .eq(UserFile::getFileName, userFile.getFileName()) + .eq(UserFile::getDeleteFlag, "0"); + List userFiles = userFileMapper.selectList(lambdaQueryWrapper1); + log.info("重复的文件:" + JSON.toJSONString(userFiles)); + for (int i = 0; i < userFiles.size() - 1; i ++) { + log.info("删除文件:" + JSON.toJSONString(userFiles.get(i))); + userFileMapper.deleteById(userFiles.get(i).getUserFileId()); + } + } + + log.info(JSON.toJSONString(repeatList)); + + LambdaQueryWrapper recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>(); + recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, deleteBatchNum); + recoveryFileMapper.delete(recoveryFileServiceLambdaQueryWrapper); + }