提交 8e1383e7 authored 作者: hzh's avatar hzh

代码优化

上级 c92bd677
......@@ -130,6 +130,9 @@ public interface TradeOrderConvert {
TradeOrderPageItemRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> items);
@Mapping(target = "createTime", expression = "java(org.dromara.common.mall.util.date.DateUtils.of(bean.getCreateTime()))")
TradeOrderPageItemRespVO convert1(TradeOrderDO bean);
ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean);
default TradeOrderDetailRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> orderItems,
......
......@@ -3,14 +3,16 @@ package org.dromara.resource.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.QueryGroup;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.web.core.BaseController;
import org.dromara.resource.domain.bo.SysOssBo;
import org.dromara.resource.domain.vo.SysOssUploadVo;
import org.dromara.resource.domain.vo.SysOssVo;
......@@ -20,8 +22,6 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
......@@ -103,4 +103,54 @@ public class SysOssController extends BaseController {
return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true));
}
/**
* 处理文件分片上传的请求。
* 接收前端传来的文件分片、文件名和分片索引,调用 MinioService 中的方法将分片保存到临时目录。
*
* @param chunk 上传的文件分片,类型为 MultipartFile
* @param filename 原始文件的名称
* @param chunkIndex 当前分片的索引,用于标识该分片在整个文件中的位置
* @return 是否成功
*/
@PostMapping("/chunk")
public R<Void> uploadChunk(@RequestParam("chunk") MultipartFile chunk,
@RequestParam("filename") String filename,
@RequestParam("chunkIndex") int chunkIndex) {
iSysOssService.uploadChunk(filename, chunkIndex, chunk);
return toAjax(true);
}
/**
* 处理文件分片合并的请求。
* 接收前端传来的文件名和总分片数,调用 MinioService 中的方法将所有分片合并并上传到 MinIO。
*
* @param filename 原始文件的名称
* @param totalChunks 整个文件的总分片数
* @return 文件信息
*/
@PostMapping("/merge")
public R<SysOssUploadVo> mergeChunks(@RequestParam("filename") String filename,
@RequestParam("totalChunks") int totalChunks) {
SysOssVo oss = iSysOssService.mergeChunks(filename, totalChunks);
SysOssUploadVo uploadVo = new SysOssUploadVo();
uploadVo.setUrl(oss.getUrl());
uploadVo.setFileName(oss.getOriginalName());
uploadVo.setOssId(oss.getOssId().toString());
return R.ok(uploadVo);
}
/**
* 处理查询已上传文件分片的请求。
* 接收前端传来的文件名,调用 MinioService 中的方法获取已上传的分片索引列表。
*
* @param filename 原始文件的名称
* @return 已上传的分片索引列表,类型为 List<Integer>
*/
@GetMapping("/uploaded-chunks")
public R<List<Integer>> getUploadedChunks(@RequestParam("filename") String filename) {
// 调用 MinioService 的 getUploadedChunks 方法获取已上传的分片索引列表
return R.ok(iSysOssService.getUploadedChunks(filename));
}
}
......@@ -92,4 +92,31 @@ public interface ISysOssService {
* @return 结果
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 上传文件分片到临时目录。
*
* @param filename 原始文件的名称
* @param chunkIndex 当前分片的索引,用于标识该分片在整个文件中的位置
* @param chunk 上传的文件分片,类型为 MultipartFile
* @throws Exception 如果在上传过程中出现异常,如文件操作异常等
*/
void uploadChunk(String filename, int chunkIndex, MultipartFile chunk);
/**
* 合并所有文件分片并将合并后的文件上传到 MinIO。
*
* @param filename 原始文件的名称
* @param totalChunks 整个文件的总分片数
* @throws Exception 如果在合并或上传过程中出现异常,如部分分片缺失、文件操作异常等
*/
SysOssVo mergeChunks(String filename, int totalChunks);
/**
* 获取已上传的文件分片索引列表。
*
* @param filename 原始文件的名称
* @return 已上传的分片索引列表,类型为 List<Integer>
*/
List<Integer> getUploadedChunks(String filename);
}
......@@ -32,6 +32,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
......@@ -260,4 +261,85 @@ public class SysOssServiceImpl implements ISysOssService {
return oss;
}
// 定义临时目录,用于存储文件分片
private static final String TEMP_DIR = "temp";
@Override
public void uploadChunk(String filename, int chunkIndex, MultipartFile chunk) {
// 创建临时目录对象
File tempDir = new File(TEMP_DIR);
// 如果临时目录不存在,则创建该目录
if (!tempDir.exists()) {
tempDir.mkdirs();
}
// 构建当前分片的临时文件对象
File tempFile = new File(tempDir, filename + ".part" + chunkIndex);
try (InputStream inputStream = chunk.getInputStream()) {
// 将文件分片的输入流复制到临时文件中
org.apache.commons.io.FileUtils.copyInputStreamToFile(inputStream, tempFile);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public SysOssVo mergeChunks(String filename, int totalChunks) {
// 创建临时目录对象
File tempDir = new File(TEMP_DIR);
// 用于存储已找到的文件分片
List<File> chunks = new ArrayList<>();
// 遍历所有分片索引
for (int i = 0; i < totalChunks; i++) {
// 构建当前分片的临时文件对象
File chunk = new File(tempDir, filename + ".part" + i);
// 如果该分片文件存在,则添加到列表中
if (chunk.exists()) {
chunks.add(chunk);
}
}
// 检查已找到的分片数量是否与总分片数一致,如果不一致则抛出异常
if (chunks.size() != totalChunks) {
throw new RuntimeException("部分分片缺失,无法合并");
}
// 构建合并后的文件对象
File mergedFile = new File(tempDir, filename);
try {
// 遍历所有分片文件,将其内容追加到合并后的文件中
for (File chunk : chunks) {
org.apache.commons.io.FileUtils.writeByteArrayToFile(mergedFile, org.apache.commons.io.FileUtils.readFileToByteArray(chunk), true);
}
String suffix = StringUtils.substring(filename, filename.lastIndexOf("."), filename.length());
OssClient storage = OssFactory.instance();
UploadResult uploadResult = storage.uploadSuffix(mergedFile, suffix);
// 保存文件信息
return buildResultEntity(filename, suffix, storage.getConfigKey(), uploadResult);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 无论合并和上传是否成功,都删除所有分片文件和合并后的文件
for (File chunk : chunks) {
chunk.delete();
}
mergedFile.delete();
}
throw new ServiceException("上传失败");
}
@Override
public List<Integer> getUploadedChunks(String filename) {
// 创建临时目录对象
File tempDir = new File(TEMP_DIR);
// 获取临时目录下所有以指定文件名开头且包含 ".part" 的文件
File[] files = tempDir.listFiles((dir, name) -> name.startsWith(filename + ".part"));
// 如果没有找到相关文件,则返回空列表
if (files == null) {
return new ArrayList<>();
}
// 提取每个文件的分片索引并收集到列表中返回
return java.util.Arrays.stream(files)
.map(file -> Integer.parseInt(file.getName().substring(file.getName().lastIndexOf(".part") + 5)))
.collect(Collectors.toList());
}
}
......@@ -38,7 +38,7 @@ public class SysDictDataController extends BaseController {
/**
* 查询字典数据列表
*/
@SaCheckPermission("system:dict:list")
// @SaCheckPermission("system:dict:list")
@GetMapping("/list")
public TableDataInfo<SysDictDataVo> list(SysDictDataBo dictData, PageQuery pageQuery) {
return dictDataService.selectPageDictDataList(dictData, pageQuery);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论