1、相同路径下上传同名文件优化处理

2、图片预览优化(深度适配阿里云OSS,fastdfs增加缓存)
3、数据保存路径修改
This commit is contained in:
马超 2021-06-17 19:17:45 +08:00
parent 450d87bbc8
commit 4e039d12eb
14 changed files with 87 additions and 60 deletions

View File

@ -4,6 +4,7 @@ import com.qiwenshare.file.domain.FileBean;
import com.qiwenshare.file.domain.StorageBean; import com.qiwenshare.file.domain.StorageBean;
import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.DownloadFileDTO;
import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO;
import com.qiwenshare.file.dto.file.PreviewDTO;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -22,6 +23,7 @@ public interface IFiletransferService {
void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId); void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId);
void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO); void downloadFile(HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO);
void previewFile(HttpServletResponse httpServletResponse, PreviewDTO previewDTO);
void deleteFile(FileBean fileBean); void deleteFile(FileBean fileBean);
StorageBean selectStorageBean(StorageBean storageBean); StorageBean selectStorageBean(StorageBean storageBean);

View File

@ -36,12 +36,11 @@ public class FileDealComp {
private IElasticSearchService elasticSearchService; private IElasticSearchService elasticSearchService;
public static Executor exec = Executors.newFixedThreadPool(10); public static Executor exec = Executors.newFixedThreadPool(10);
@Resource
UFOFactory ufoFactory;
/** /**
* 获取重复文件名 * 获取重复文件名
* *
* 场景: 文件还原时 savefilePath 路径下保存 测试.txt 文件重名则会生成 测试(1).txt * 场景1: 文件还原时 savefilePath 路径下保存 测试.txt 文件重名则会生成 测试(1).txt
* 场景2 上传文件时 savefilePath 路径下保存 测试.txt 文件重名则会生成 测试(1).txt
* *
* @param userFile * @param userFile
* @param savefilePath * @param savefilePath

View File

@ -2,9 +2,12 @@ package com.qiwenshare.file.config;
import com.qiwenshare.file.interceptor.AuthenticationInterceptor; import com.qiwenshare.file.interceptor.AuthenticationInterceptor;
import joptsimple.util.PathProperties;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -44,11 +47,13 @@ public class WebMvcConfig implements WebMvcConfigurer {
list.add("/share/**"); list.add("/share/**");
registry.addInterceptor(authenticationInterceptor) registry.addInterceptor(authenticationInterceptor)
.addPathPatterns(list) .addPathPatterns(list)
.excludePathPatterns("/filetransfer/downloadfile", .excludePathPatterns("/file",
"/filetransfer/downloadfile",
"/filetransfer/preview", "/filetransfer/preview",
"/share/sharefileList", "/share/sharefileList",
"/share/sharetype", "/share/sharetype",
"/share/checkextractioncode", "/share/checkextractioncode",
"/share/checkendtime"); "/share/checkendtime");
} }
} }

View File

@ -45,7 +45,7 @@ import static com.qiwenshare.common.util.FileUtil.getFileExtendsByType;
@Tag(name = "file", description = "该接口为文件接口,主要用来做一些文件的基本操作,如创建目录,删除,移动,复制等。") @Tag(name = "file", description = "该接口为文件接口,主要用来做一些文件的基本操作,如创建目录,删除,移动,复制等。")
@RestController @RestController
@Slf4j @Slf4j
@RequestMapping("/file") @RequestMapping({"/file", "/api/file"})
public class FileController { public class FileController {
@Resource @Resource

View File

@ -19,6 +19,7 @@ import com.qiwenshare.file.dto.DownloadFileDTO;
import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO;
import com.qiwenshare.file.dto.file.PreviewDTO; import com.qiwenshare.file.dto.file.PreviewDTO;
import com.qiwenshare.file.service.StorageService; import com.qiwenshare.file.service.StorageService;
import com.qiwenshare.file.vo.file.FileListVo;
import com.qiwenshare.file.vo.file.UploadFileVo; import com.qiwenshare.file.vo.file.UploadFileVo;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -30,6 +31,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -37,7 +39,7 @@ import java.util.Map;
@Slf4j @Slf4j
@Tag(name = "filetransfer", description = "该接口为文件传输接口,主要用来做文件的上传和下载") @Tag(name = "filetransfer", description = "该接口为文件传输接口,主要用来做文件的上传和下载")
@RestController @RestController
@RequestMapping("/filetransfer") @RequestMapping({"/filetransfer", "/api/filetransfer"})
public class FiletransferController { public class FiletransferController {
@Resource @Resource
@ -77,19 +79,28 @@ public class FiletransferController {
FileBean file = list.get(0); FileBean file = list.get(0);
UserFile userFile = new UserFile(); UserFile userFile = new UserFile();
userFile.setFileId(file.getFileId());
userFile.setUserId(sessionUserBean.getUserId()); userFile.setUserId(sessionUserBean.getUserId());
userFile.setFilePath(uploadFileDto.getFilePath()); userFile.setFilePath(uploadFileDto.getFilePath());
String fileName = uploadFileDto.getFilename(); String fileName = uploadFileDto.getFilename();
userFile.setFileName(fileName.substring(0, fileName.lastIndexOf("."))); userFile.setFileName(FileUtil.getFileNameNotExtend(fileName));
userFile.setExtendName(FileUtil.getFileExtendName(fileName)); userFile.setExtendName(FileUtil.getFileExtendName(fileName));
userFile.setDeleteFlag(0); userFile.setDeleteFlag(0);
userFile.setIsDir(0); List<FileListVo> userFileList = userFileService.userFileList(userFile, null, null);
userFile.setUploadTime(DateUtil.getCurrentTime()); if (userFileList.size() <= 0) {
userFileService.save(userFile);
fileService.increaseFilePointCount(file.getFileId()); userFile.setIsDir(0);
userFile.setUploadTime(DateUtil.getCurrentTime());
userFile.setFileId(file.getFileId());
//"fileName", "filePath", "extendName", "deleteFlag", "userId"
userFileService.save(userFile);
fileService.increaseFilePointCount(file.getFileId());
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
}
uploadFileVo.setSkipUpload(true); uploadFileVo.setSkipUpload(true);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
} else { } else {
uploadFileVo.setSkipUpload(false); uploadFileVo.setSkipUpload(false);
@ -171,11 +182,9 @@ public class FiletransferController {
} }
httpServletResponse.addHeader("Content-Disposition", "fileName=" + fileName);// 设置文件名 httpServletResponse.addHeader("Content-Disposition", "fileName=" + fileName);// 设置文件名
DownloadFileDTO downloadFileDTO = new DownloadFileDTO();
downloadFileDTO.setUserFileId(previewDTO.getUserFileId());
downloadFileDTO.setIsMin(previewDTO.getIsMin());
try { try {
filetransferService.downloadFile(httpServletResponse, downloadFileDTO); filetransferService.previewFile(httpServletResponse, previewDTO);
}catch (Exception e){ }catch (Exception e){
//org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接 //org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接
e.printStackTrace(); e.printStackTrace();

View File

@ -28,7 +28,7 @@ import java.util.List;
@Tag(name = "recoveryfile", description = "文件删除后会进入回收站,该接口主要是对回收站文件进行管理") @Tag(name = "recoveryfile", description = "文件删除后会进入回收站,该接口主要是对回收站文件进行管理")
@RestController @RestController
@Slf4j @Slf4j
@RequestMapping("/recoveryfile") @RequestMapping({"/recoveryfile", "/api/recoveryfile"})
public class RecoveryFileController { public class RecoveryFileController {
@Resource @Resource
IRecoveryFileService recoveryFileService; IRecoveryFileService recoveryFileService;

View File

@ -32,7 +32,7 @@ import java.util.*;
@Tag(name = "share", description = "该接口为文件分享接口") @Tag(name = "share", description = "该接口为文件分享接口")
@RestController @RestController
@Slf4j @Slf4j
@RequestMapping("/share") @RequestMapping({"/share", "/api/share"})
public class ShareController { public class ShareController {
public static final String CURRENT_MODULE = "文件分享"; public static final String CURRENT_MODULE = "文件分享";

View File

@ -28,7 +28,7 @@ import java.util.Map;
@Tag(name = "user", description = "该接口为用户接口主要做用户登录注册和校验token") @Tag(name = "user", description = "该接口为用户接口主要做用户登录注册和校验token")
@RestController @RestController
@Slf4j @Slf4j
@RequestMapping("/user") @RequestMapping({"/user", "/api/user"})
public class UserController { public class UserController {
@Resource @Resource
@ -102,8 +102,6 @@ public class UserController {
} }
UserBean sessionUserBean = userService.getUserBeanByToken(token); UserBean sessionUserBean = userService.getUserBeanByToken(token);
if (sessionUserBean != null) { if (sessionUserBean != null) {
String domain = UFOAutoConfiguration.aliyunConfig.getOss().getDomain();
sessionUserBean.setViewDomain(domain);
return RestResult.success().data(sessionUserBean); return RestResult.success().data(sessionUserBean);
} else { } else {

View File

@ -96,10 +96,6 @@ public class UserBean {
@TableField(exist = false) @TableField(exist = false)
private String token; private String token;
@Transient
@TableField(exist = false)
private String viewDomain;
/** /**
* 角色列表 * 角色列表
*/ */

View File

@ -7,5 +7,4 @@ import lombok.Data;
@Schema(name = "下载文件DTO",required = true) @Schema(name = "下载文件DTO",required = true)
public class DownloadFileDTO { public class DownloadFileDTO {
private Long userFileId; private Long userFileId;
private String isMin;
} }

View File

@ -16,19 +16,6 @@ public class UploadFileDTO {
@Schema(description = "文件路径") @Schema(description = "文件路径")
private String filePath; private String filePath;
/**
* 上传时间
*/
@Schema(description = "上传时间")
private String uploadTime;
/**
* 扩展名
*/
@Schema(description = "扩展名")
private String extendName;
@Schema(description = "文件名") @Schema(description = "文件名")
private String filename; private String filename;

View File

@ -24,11 +24,14 @@ import com.qiwenshare.file.component.FileDealComp;
import com.qiwenshare.file.domain.UserFile; import com.qiwenshare.file.domain.UserFile;
import com.qiwenshare.file.dto.DownloadFileDTO; import com.qiwenshare.file.dto.DownloadFileDTO;
import com.qiwenshare.file.dto.UploadFileDTO; import com.qiwenshare.file.dto.UploadFileDTO;
import com.qiwenshare.file.dto.file.PreviewDTO;
import com.qiwenshare.file.mapper.FileMapper; import com.qiwenshare.file.mapper.FileMapper;
import com.qiwenshare.file.domain.FileBean; import com.qiwenshare.file.domain.FileBean;
import com.qiwenshare.file.domain.StorageBean; import com.qiwenshare.file.domain.StorageBean;
import com.qiwenshare.file.mapper.StorageMapper; import com.qiwenshare.file.mapper.StorageMapper;
import com.qiwenshare.file.mapper.UserFileMapper; import com.qiwenshare.file.mapper.UserFileMapper;
import com.qiwenshare.file.vo.file.FileListVo;
import com.qiwenshare.ufo.exception.DownloadException;
import com.qiwenshare.ufo.exception.UploadException; import com.qiwenshare.ufo.exception.UploadException;
import com.qiwenshare.ufo.factory.StorageTypeEnum; import com.qiwenshare.ufo.factory.StorageTypeEnum;
import com.qiwenshare.ufo.factory.UFOFactory; import com.qiwenshare.ufo.factory.UFOFactory;
@ -36,6 +39,8 @@ import com.qiwenshare.ufo.operation.delete.Deleter;
import com.qiwenshare.ufo.operation.delete.domain.DeleteFile; import com.qiwenshare.ufo.operation.delete.domain.DeleteFile;
import com.qiwenshare.ufo.operation.download.Downloader; import com.qiwenshare.ufo.operation.download.Downloader;
import com.qiwenshare.ufo.operation.download.domain.DownloadFile; import com.qiwenshare.ufo.operation.download.domain.DownloadFile;
import com.qiwenshare.ufo.operation.preview.Previewer;
import com.qiwenshare.ufo.operation.preview.domain.PreviewFile;
import com.qiwenshare.ufo.operation.upload.Uploader; import com.qiwenshare.ufo.operation.upload.Uploader;
import com.qiwenshare.ufo.operation.upload.domain.UploadFile; import com.qiwenshare.ufo.operation.upload.domain.UploadFile;
import com.qiwenshare.ufo.util.PathUtil; import com.qiwenshare.ufo.util.PathUtil;
@ -62,16 +67,16 @@ public class FiletransferService implements IFiletransferService {
FileDealComp fileDealComp; FileDealComp fileDealComp;
@Override @Override
public void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, Long userId) { public void uploadFile(HttpServletRequest request, UploadFileDTO uploadFileDto, Long userId) {
UploadFile uploadFile = new UploadFile(); UploadFile uploadFile = new UploadFile();
uploadFile.setChunkNumber(UploadFileDto.getChunkNumber()); uploadFile.setChunkNumber(uploadFileDto.getChunkNumber());
uploadFile.setChunkSize(UploadFileDto.getChunkSize()); uploadFile.setChunkSize(uploadFileDto.getChunkSize());
uploadFile.setTotalChunks(UploadFileDto.getTotalChunks()); uploadFile.setTotalChunks(uploadFileDto.getTotalChunks());
uploadFile.setIdentifier(UploadFileDto.getIdentifier()); uploadFile.setIdentifier(uploadFileDto.getIdentifier());
uploadFile.setTotalSize(UploadFileDto.getTotalSize()); uploadFile.setTotalSize(uploadFileDto.getTotalSize());
uploadFile.setCurrentChunkSize(UploadFileDto.getCurrentChunkSize()); uploadFile.setCurrentChunkSize(uploadFileDto.getCurrentChunkSize());
Uploader uploader = ufoFactory.getUploader(); Uploader uploader = ufoFactory.getUploader();
if (uploader == null) { if (uploader == null) {
@ -83,7 +88,7 @@ public class FiletransferService implements IFiletransferService {
for (int i = 0; i < uploadFileList.size(); i++){ for (int i = 0; i < uploadFileList.size(); i++){
uploadFile = uploadFileList.get(i); uploadFile = uploadFileList.get(i);
FileBean fileBean = new FileBean(); FileBean fileBean = new FileBean();
BeanUtil.copyProperties(UploadFileDto, fileBean); BeanUtil.copyProperties(uploadFileDto, fileBean);
fileBean.setTimeStampName(uploadFile.getTimeStampName()); fileBean.setTimeStampName(uploadFile.getTimeStampName());
if (uploadFile.getSuccess() == 1){ if (uploadFile.getSuccess() == 1){
fileBean.setFileUrl(uploadFile.getUrl()); fileBean.setFileUrl(uploadFile.getUrl());
@ -92,13 +97,19 @@ public class FiletransferService implements IFiletransferService {
fileBean.setPointCount(1); fileBean.setPointCount(1);
fileMapper.insert(fileBean); fileMapper.insert(fileBean);
UserFile userFile = new UserFile(); UserFile userFile = new UserFile();
userFile.setFileId(fileBean.getFileId()); userFile.setFilePath(uploadFileDto.getFilePath());
userFile.setExtendName(uploadFile.getFileType());
userFile.setFileName(uploadFile.getFileName());
userFile.setFilePath(UploadFileDto.getFilePath());
userFile.setDeleteFlag(0);
userFile.setUserId(userId); userFile.setUserId(userId);
userFile.setFileName(uploadFile.getFileName());
userFile.setExtendName(uploadFile.getFileType());
userFile.setDeleteFlag(0);
userFile.setIsDir(0); userFile.setIsDir(0);
List<FileListVo> userFileList = userFileMapper.userFileList(userFile, null, null);
if (userFileList.size() > 0) {
String fileName = fileDealComp.getRepeatFileName(userFile, uploadFileDto.getFilePath());
userFile.setFileName(fileName);
}
userFile.setFileId(fileBean.getFileId());
userFile.setUploadTime(DateUtil.getCurrentTime()); userFile.setUploadTime(DateUtil.getCurrentTime());
userFileMapper.insert(userFile); userFileMapper.insert(userFile);
fileDealComp.uploadESByUserFileId(userFile.getUserFileId()); fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
@ -118,14 +129,11 @@ public class FiletransferService implements IFiletransferService {
Downloader downloader = ufoFactory.getDownloader(fileBean.getStorageType()); Downloader downloader = ufoFactory.getDownloader(fileBean.getStorageType());
if (downloader == null) { if (downloader == null) {
log.error("下载失败文件存储类型不支持下载storageType:{}", fileBean.getStorageType()); log.error("下载失败文件存储类型不支持下载storageType:{}", fileBean.getStorageType());
throw new UploadException("下载失败"); throw new DownloadException("下载失败");
} }
DownloadFile downloadFile = new DownloadFile(); DownloadFile downloadFile = new DownloadFile();
if ("true".equals(downloadFileDTO.getIsMin())) {
downloadFile.setFileUrl(fileBean.getFileUrl().replace("." + userFile.getExtendName(), "_min." + userFile.getExtendName())); downloadFile.setFileUrl(fileBean.getFileUrl());
} else {
downloadFile.setFileUrl(fileBean.getFileUrl());
}
downloadFile.setFileSize(fileBean.getFileSize()); downloadFile.setFileSize(fileBean.getFileSize());
downloader.download(httpServletResponse, downloadFile); downloader.download(httpServletResponse, downloadFile);
@ -210,6 +218,26 @@ public class FiletransferService implements IFiletransferService {
} }
} }
@Override
public void previewFile(HttpServletResponse httpServletResponse, PreviewDTO previewDTO) {
UserFile userFile = userFileMapper.selectById(previewDTO.getUserFileId());
FileBean fileBean = fileMapper.selectById(userFile.getFileId());
Previewer previewer = ufoFactory.getPreviewer(fileBean.getStorageType());
if (previewer == null) {
log.error("预览失败文件存储类型不支持预览storageType:{}", fileBean.getStorageType());
throw new UploadException("预览失败");
}
PreviewFile previewFile = new PreviewFile();
previewFile.setFileUrl(fileBean.getFileUrl());
previewFile.setFileSize(fileBean.getFileSize());
if ("true".equals(previewDTO.getIsMin())) {
previewer.imageThumbnailPreview(httpServletResponse, previewFile);
} else {
previewer.imageOriginalPreview(httpServletResponse, previewFile);
}
}
@Override @Override
public void deleteFile(FileBean fileBean) { public void deleteFile(FileBean fileBean) {
Deleter deleter = null; Deleter deleter = null;

View File

@ -1,8 +1,9 @@
#jdbc连接-h2数据库 #jdbc连接-h2数据库
spring.datasource.driverClassName=org.h2.Driver spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url = jdbc:h2:file:D:/temp_db/file;MODE=MYSQL;DATABASE_TO_LOWER=TRUE spring.datasource.url = jdbc:h2:file:C:/ProgramData/QiwenNetDisk/file;MODE=MYSQL;DATABASE_TO_LOWER=TRUE
spring.datasource.username=sa spring.datasource.username=sa
spring.datasource.password= spring.datasource.password=
spring.h2.console.enabled=true spring.h2.console.enabled=true

View File

@ -27,6 +27,9 @@
<if test="userFile.userFileId != null"> <if test="userFile.userFileId != null">
and a.userFileId = #{userFile.userFileId} and a.userFileId = #{userFile.userFileId}
</if> </if>
<if test="userFile.fileName != null">
and a.fileName = #{userFile.fileName}
</if>
and a.deleteFlag = 0 and a.deleteFlag = 0
</where> </where>
ORDER BY isDir desc ORDER BY isDir desc