代码优化

This commit is contained in:
马超 2021-03-18 20:48:15 +08:00
parent bca2335d0c
commit 0360482610
10 changed files with 195 additions and 82 deletions

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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) {

View File

@ -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

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -59,65 +59,65 @@ public class RecoveryFileService extends ServiceImpl<RecoveryFileMapper, Recove
}
// public void restorefile() {
// LambdaUpdateWrapper<UserFile> 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<UserFile> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.eq(UserFile::getFilePath, filePath + "/")
// .eq(UserFile::getDeleteFlag, 0)
// .eq(UserFile::getUserId, sessionUserBean.getUserId());
// List<UserFile> 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<UserFile> 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<UserFile> repeatList = userFileService.list(lambdaQueryWrapper);
//
// for (UserFile userFile : repeatList) {
// LambdaQueryWrapper<UserFile> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
// lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath())
// .eq(UserFile::getFileName, userFile.getFileName())
// .eq(UserFile::getDeleteFlag, "0");
// List<UserFile> 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<RecoveryFile> recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>();
// recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, restoreFileDto.getDeleteBatchNum());
// recoveryFileService.remove(recoveryFileServiceLambdaQueryWrapper);
// }
public void restorefile(String deleteBatchNum, String filePath, Long sessionUserId) {
LambdaUpdateWrapper<UserFile> 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<UserFile> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UserFile::getFilePath, parentFilePath + "/")
.eq(UserFile::getDeleteFlag, 0)
.eq(UserFile::getUserId, sessionUserId);
List<UserFile> 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<UserFile> 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<UserFile> repeatList = userFileMapper.selectList(lambdaQueryWrapper);
for (UserFile userFile : repeatList) {
LambdaQueryWrapper<UserFile> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.eq(UserFile::getFilePath, userFile.getFilePath())
.eq(UserFile::getFileName, userFile.getFileName())
.eq(UserFile::getDeleteFlag, "0");
List<UserFile> 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<RecoveryFile> recoveryFileServiceLambdaQueryWrapper = new LambdaQueryWrapper<>();
recoveryFileServiceLambdaQueryWrapper.eq(RecoveryFile::getDeleteBatchNum, deleteBatchNum);
recoveryFileMapper.delete(recoveryFileServiceLambdaQueryWrapper);
}