feat(data-management): 添加数据集文件取消上传功能

- 在OpenAPI规范中定义了取消上传的REST端点接口
- 实现了DatasetFileApplicationService中的取消上传业务逻辑
- 在FileService中添加了完整的取消上传服务方法
- 创建了DatasetUploadController控制器处理取消上传请求
- 实现了临时分片文件清理和数据库记录删除功能
This commit is contained in:
2026-02-04 16:25:03 +08:00
parent 4220284f5a
commit 394e2bda18
4 changed files with 98 additions and 20 deletions

View File

@@ -447,12 +447,12 @@ paths:
schema: schema:
type: string type: string
/data-management/datasets/{datasetId}/files/upload/chunk: /data-management/datasets/{datasetId}/files/upload/chunk:
post: post:
tags: [ DatasetFile ] tags: [ DatasetFile ]
operationId: chunkUpload operationId: chunkUpload
summary: 切片上传 summary: 切片上传
description: 使用预上传返回的请求ID进行分片上传 description: 使用预上传返回的请求ID进行分片上传
parameters: parameters:
- name: datasetId - name: datasetId
in: path in: path
@@ -466,15 +466,32 @@ paths:
multipart/form-data: multipart/form-data:
schema: schema:
$ref: '#/components/schemas/UploadFileRequest' $ref: '#/components/schemas/UploadFileRequest'
responses: responses:
'200': '200':
description: 上传成功 description: 上传成功
/data-management/dataset-types: /data-management/datasets/upload/cancel-upload/{reqId}:
get: put:
operationId: getDatasetTypes tags: [ DatasetFile ]
tags: [DatasetType] operationId: cancelUpload
summary: 获取数据集类型列表 summary: 取消上传
description: 取消预上传请求并清理临时分片
parameters:
- name: reqId
in: path
required: true
schema:
type: string
description: 预上传请求ID
responses:
'200':
description: 取消成功
/data-management/dataset-types:
get:
operationId: getDatasetTypes
tags: [DatasetType]
summary: 获取数据集类型列表
description: 获取所有支持的数据集类型 description: 获取所有支持的数据集类型
responses: responses:
'200': '200':

View File

@@ -499,11 +499,19 @@ public class DatasetFileApplicationService {
* *
* @param uploadFileRequest 上传请求 * @param uploadFileRequest 上传请求
*/ */
@Transactional @Transactional
public void chunkUpload(String datasetId, UploadFileRequest uploadFileRequest) { public void chunkUpload(String datasetId, UploadFileRequest uploadFileRequest) {
FileUploadResult uploadResult = fileService.chunkUpload(DatasetConverter.INSTANCE.toChunkUploadRequest(uploadFileRequest)); FileUploadResult uploadResult = fileService.chunkUpload(DatasetConverter.INSTANCE.toChunkUploadRequest(uploadFileRequest));
saveFileInfoToDb(uploadResult, datasetId); saveFileInfoToDb(uploadResult, datasetId);
} }
/**
* 取消上传
*/
@Transactional
public void cancelUpload(String reqId) {
fileService.cancelUpload(reqId);
}
private void saveFileInfoToDb(FileUploadResult fileUploadResult, String datasetId) { private void saveFileInfoToDb(FileUploadResult fileUploadResult, String datasetId) {
if (Objects.isNull(fileUploadResult.getSavedFile())) { if (Objects.isNull(fileUploadResult.getSavedFile())) {

View File

@@ -0,0 +1,33 @@
package com.datamate.datamanagement.interfaces.rest;
import com.datamate.datamanagement.application.DatasetFileApplicationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 数据集上传控制器
*/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/data-management/datasets/upload")
public class DatasetUploadController {
private final DatasetFileApplicationService datasetFileApplicationService;
/**
* 取消上传
*
* @param reqId 预上传请求ID
*/
@PutMapping("/cancel-upload/{reqId}")
public ResponseEntity<Void> cancelUpload(@PathVariable("reqId") String reqId) {
datasetFileApplicationService.cancelUpload(reqId);
return ResponseEntity.ok().build();
}
}

View File

@@ -74,6 +74,26 @@ public class FileService {
.build(); .build();
} }
/**
* 取消上传
*/
@Transactional
public void cancelUpload(String reqId) {
if (reqId == null || reqId.isBlank()) {
throw BusinessException.of(CommonErrorCode.PARAM_ERROR);
}
ChunkUploadPreRequest preRequest = chunkUploadRequestMapper.findById(reqId);
if (preRequest == null) {
return;
}
String uploadPath = preRequest.getUploadPath();
if (uploadPath != null && !uploadPath.isBlank()) {
File tempDir = new File(uploadPath, String.format(ChunksSaver.TEMP_DIR_NAME_FORMAT, preRequest.getId()));
ChunksSaver.deleteFolder(tempDir.getPath());
}
chunkUploadRequestMapper.deleteById(reqId);
}
private File uploadFile(ChunkUploadRequest fileUploadRequest, ChunkUploadPreRequest preRequest) { private File uploadFile(ChunkUploadRequest fileUploadRequest, ChunkUploadPreRequest preRequest) {
File savedFile = ChunksSaver.saveFile(fileUploadRequest, preRequest); File savedFile = ChunksSaver.saveFile(fileUploadRequest, preRequest);
preRequest.setTimeout(LocalDateTime.now().plusSeconds(DEFAULT_TIMEOUT)); preRequest.setTimeout(LocalDateTime.now().plusSeconds(DEFAULT_TIMEOUT));