文件模块已完成
This commit is contained in:
@ -19,13 +19,13 @@ public interface FileInfoService extends IService<FileInfo> {
|
||||
/**
|
||||
* 校验文件
|
||||
*/
|
||||
void validFile(MultipartFile multipartFile);
|
||||
void validFile(MultipartFile multipartFile, UploadFileRequest uploadFileRequest);
|
||||
|
||||
|
||||
/**
|
||||
* 获取文件保存路径
|
||||
*/
|
||||
String uploadFile(MultipartFile multipartFile, UploadFileRequest uploadFileRequest);
|
||||
String uploadFile(MultipartFile multipartFile, UploadFileRequest uploadFileRequest) throws IOException;
|
||||
|
||||
|
||||
/**
|
||||
|
@ -16,7 +16,8 @@ import com.greenorange.promotion.service.file.FileInfoService;
|
||||
import com.greenorange.promotion.mapper.FileInfoMapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.apache.commons.lang3.RandomStringUtils;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.apache.commons.lang.RandomStringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
@ -51,7 +52,11 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
* 校验文件
|
||||
*/
|
||||
@Override
|
||||
public void validFile(MultipartFile multipartFile) {
|
||||
public void validFile(MultipartFile multipartFile, UploadFileRequest uploadFileRequest) {
|
||||
// 获取业务名称
|
||||
String biz = uploadFileRequest.getBiz();
|
||||
FileUploadBizEnum fileUploadBizEnum = FileUploadBizEnum.getEnumByValue(biz);
|
||||
ThrowUtils.throwIf(fileUploadBizEnum == null, ErrorCode.PARAMS_ERROR, "业务名称错误");
|
||||
// 文件大小
|
||||
long fileSize = multipartFile.getSize();
|
||||
// 文件后缀
|
||||
@ -67,7 +72,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
* 获取文件保存路径
|
||||
*/
|
||||
@Override
|
||||
public String uploadFile(MultipartFile multipartFile, UploadFileRequest uploadFileRequest) {
|
||||
public String uploadFile(MultipartFile multipartFile, UploadFileRequest uploadFileRequest) throws IOException {
|
||||
// 获取业务名称
|
||||
String biz = uploadFileRequest.getBiz();
|
||||
// 获取文件名
|
||||
@ -76,11 +81,20 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
String fileType = FileUtil.getSuffix(fileName);
|
||||
// 获取文件路径
|
||||
// 获取view值
|
||||
String view = RandomStringUtils.random(8);
|
||||
String view = RandomStringUtils.random(8, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
|
||||
// 获取文件路径
|
||||
String filePath = String.format("%s/%s", biz, fileName);
|
||||
String filePath = String.format("%s-%s", biz, fileName);
|
||||
// 获取文件大小
|
||||
Double fileSize = multipartFile.getSize() / 1024.0;
|
||||
fileSize = Double.valueOf(String.format("%.2f", fileSize));
|
||||
// 获取文件哈希值
|
||||
InputStream inputStream = multipartFile.getInputStream();
|
||||
String hashValue = DigestUtils.sha256Hex(inputStream);
|
||||
// 判断是否存在哈希值相同的图片
|
||||
LambdaQueryWrapper<FileInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
lambdaQueryWrapper.eq(FileInfo::getHashValue, hashValue);
|
||||
FileInfo fileInfo = this.getOne(lambdaQueryWrapper);
|
||||
if (fileInfo != null) return fileInfo.getFileView();
|
||||
// 保存文件
|
||||
FileInfoAddRequest fileInfoAddRequest = FileInfoAddRequest.builder()
|
||||
.name(fileName)
|
||||
@ -89,8 +103,9 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
.size(fileSize)
|
||||
.fileView(view)
|
||||
.biz(biz)
|
||||
.hashValue(hashValue)
|
||||
.build();
|
||||
FileInfo fileInfo = commonService.copyProperties(fileInfoAddRequest, FileInfo.class);
|
||||
fileInfo = commonService.copyProperties(fileInfoAddRequest, FileInfo.class);
|
||||
this.save(fileInfo);
|
||||
// 创建上传目录,如果不存在
|
||||
File file = new File(UPLOAD_DIR + filePath);
|
||||
@ -107,6 +122,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 文件下载
|
||||
* @param filename 业务名称/view值
|
||||
@ -114,8 +130,8 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
*/
|
||||
@Override
|
||||
public void downloadFile(String filename, HttpServletResponse response) throws IOException{
|
||||
ThrowUtils.throwIf(!filename.contains("/"), ErrorCode.PARAMS_ERROR);
|
||||
String[] split = filename.split("/");
|
||||
ThrowUtils.throwIf(!filename.contains("-"), ErrorCode.PARAMS_ERROR);
|
||||
String[] split = filename.split("-");
|
||||
FileUploadBizEnum fileUploadBizEnum = FileUploadBizEnum.getEnumByValue(split[0]);
|
||||
ThrowUtils.throwIf(fileUploadBizEnum == null, ErrorCode.PARAMS_ERROR, "业务类型错误");
|
||||
LambdaQueryWrapper<FileInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
@ -126,7 +142,7 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo>
|
||||
File file = new File(UPLOAD_DIR + fileInfo.getPath());
|
||||
// // 设置response的Header
|
||||
response.setContentType("application/octet-stream");
|
||||
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), StandardCharsets.UTF_8));
|
||||
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileInfo.getName(), StandardCharsets.UTF_8));
|
||||
response.setContentLengthLong(file.length()); // 使用 setContentLengthLong 适应大文件
|
||||
|
||||
// 设置缓存相关的 HTTP 头
|
||||
|
Reference in New Issue
Block a user