fix(接口定义): 修复接口中上传的文件删除后,服务器文件中仍存在的缺陷 (#17711)

--bug=1016591 --user=王孝刚 [接口测试] github#17664接口中上传的文件删除后,服务器文件中仍存在
https://www.tapd.cn/55049933/s/1239342

Co-authored-by: wxg0103 <727495428@qq.com>
This commit is contained in:
MeterSphere Bot 2022-09-06 18:21:15 +08:00 committed by GitHub
parent 45b771f0ff
commit 82282fa857
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 0 deletions

View File

@ -376,6 +376,12 @@ public class ApiAutomationService {
} }
deleteUpdateBodyFile(scenario, beforeScenario); deleteUpdateBodyFile(scenario, beforeScenario);
if (CollectionUtils.isNotEmpty(request.getScenarioDefinition().getHashTree())) {
request.getScenarioDefinition().getHashTree().stream().forEach(hashTree -> {
//删除不需要的文件
FileUtils.deleteBodyFiles(hashTree);
});
}
scenario.setCreateUser(null); // 更新时不更新创建人 scenario.setCreateUser(null); // 更新时不更新创建人
ApiScenarioExample example = new ApiScenarioExample(); ApiScenarioExample example = new ApiScenarioExample();
example.createCriteria().andIdEqualTo(scenario.getId()).andVersionIdEqualTo(request.getVersionId()); example.createCriteria().andIdEqualTo(scenario.getId()).andVersionIdEqualTo(request.getVersionId());

View File

@ -357,6 +357,8 @@ public class ApiDefinitionService {
MockConfigService mockConfigService = CommonBeanFactory.getBean(MockConfigService.class); MockConfigService mockConfigService = CommonBeanFactory.getBean(MockConfigService.class);
mockConfigService.updateMockReturnMsgByApi(returnModel); mockConfigService.updateMockReturnMsgByApi(returnModel);
FileUtils.createBodyFiles(request.getRequest().getId(), bodyFiles); FileUtils.createBodyFiles(request.getRequest().getId(), bodyFiles);
//删除不需要的文件
FileUtils.deleteBodyFiles(request.getRequest());
return getById(returnModel.getId()); return getById(returnModel.getId());
} }

View File

@ -1,9 +1,13 @@
package io.metersphere.commons.utils; package io.metersphere.commons.utils;
import io.metersphere.api.dto.definition.request.sampler.MsHTTPSamplerProxy;
import io.metersphere.api.dto.scenario.Body;
import io.metersphere.api.dto.scenario.KeyValue;
import io.metersphere.api.dto.scenario.request.BodyFile; import io.metersphere.api.dto.scenario.request.BodyFile;
import io.metersphere.base.domain.JarConfig; import io.metersphere.base.domain.JarConfig;
import io.metersphere.commons.exception.MSException; import io.metersphere.commons.exception.MSException;
import io.metersphere.i18n.Translator; import io.metersphere.i18n.Translator;
import io.metersphere.plugin.core.MsTestElement;
import io.metersphere.service.JarConfigService; import io.metersphere.service.JarConfigService;
import io.metersphere.utils.LoggerUtil; import io.metersphere.utils.LoggerUtil;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
@ -19,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -120,6 +125,42 @@ public class FileUtils {
} }
} }
public static void deleteBodyFiles(MsTestElement request) {
if (StringUtils.isNotBlank(request.getId())) {
String path = BODY_FILE_DIR + File.separator + request.getId();
File testDir = new File(path);
if (!testDir.exists()) {
return;
}
List<String> files = new ArrayList<>();
if (request != null && StringUtils.equalsIgnoreCase(request.getType(), HTTPSamplerProxy.class.getSimpleName())) {
MsHTTPSamplerProxy samplerProxy = (MsHTTPSamplerProxy) request;
Body body = samplerProxy.getBody();
if (body != null && !CollectionUtils.isEmpty(body.getKvs())) {
body.getKvs().stream().filter(KeyValue::isFile).forEach(keyValue -> {
files.addAll(keyValue.getFiles().stream().map(BodyFile::getName).collect(Collectors.toList()));
});
}
if (body != null && !CollectionUtils.isEmpty(body.getBinary())) {
body.getBinary().stream().filter(KeyValue::isFile).filter(KeyValue::isEnable).forEach(keyValue -> {
files.addAll(keyValue.getFiles().stream().map(BodyFile::getName).collect(Collectors.toList()));
});
}
}
File[] optFilesName = testDir.listFiles();
if (CollectionUtils.isNotEmpty(files)) {
for (File f : optFilesName) {
if (!files.contains(f.getName())) {
f.delete();
}
}
} else {
FileUtil.deleteContents(testDir);
testDir.delete();
}
}
}
public static void copyBodyFiles(String sourceId, String targetId) { public static void copyBodyFiles(String sourceId, String targetId) {
try { try {