diff --git a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java index 69e2007..821eaff 100644 --- a/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java +++ b/src/main/java/com/ruoyi/airline/service/impl/AirlineFileServiceImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.airline.service.impl; -import com.ruoyi.airline.api.domain.AirLinePointVO; import com.ruoyi.airline.domain.api.IAirlineFileDomain; import com.ruoyi.airline.domain.model.AirlineFile; import com.ruoyi.airline.domain.model.kml.KmlInfo; @@ -24,7 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.UUID; @@ -66,43 +65,71 @@ public class AirlineFileServiceImpl implements IAirlineFileService { @Override public AirlineFileDTO parseAndUplload(MultipartFile file) { - KmlInfo kmlInfo = new KmlInfo(); - try (ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(file.getInputStream());) { - ArchiveEntry entry; - while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) { - String name = entry.getName(); - if (name.toLowerCase().endsWith(".kml")) { - // 解KML文件 - kmlInfo = KmlFileUtils.parseKml(archiveInputStream); + String originalFilename = file.getOriginalFilename(); + String fileExtension = ""; + if (originalFilename != null && originalFilename.lastIndexOf('.') > 0) { + fileExtension = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase(); + } + + try { + if ("zip".equals(fileExtension) || "kmz".equals(fileExtension)) { + // 处理ZIP/KMZ文件 + KmlInfo kmlInfo = new KmlInfo(); + try (ArchiveInputStream archiveInputStream = new ZipArchiveInputStream(file.getInputStream());) { + ArchiveEntry entry; + while (!Objects.isNull(entry = archiveInputStream.getNextEntry())) { + String name = entry.getName(); + if (name.toLowerCase().endsWith(".kml")) { + // 解KML文件 + kmlInfo = KmlFileUtils.parseKml(archiveInputStream); + } + } + + if (Objects.isNull(kmlInfo)) { + throw new BaseException("kmz文件内容缺失"); + } + String globalHeight = kmlInfo.getDocument().getFolder().getGlobalHeight(); + R fileUrl = remoteFileService.uploadFileByData(UUID.randomUUID().toString(), "waypoints", WayPointUitls.kmz2waypoint(kmlInfo)); + AirlineFileDTO dto = new AirlineFileDTO(); + // 去除文件名中的后缀名 + int pos = originalFilename.lastIndexOf("."); + String fileNameWithoutExtension = pos > 0 ? originalFilename.substring(0, pos) : originalFilename; + List airlineFiles =iAirlineFileDomain.selectFileNameLike(fileNameWithoutExtension); + + List fileNames = airlineFiles.stream().map(AirlineFile::getName).toList(); + String newFileName = FileUtils.generateUniqueFileName(fileNameWithoutExtension, fileNames); + dto.setFileName(newFileName); + dto.setFileUrl(fileUrl.getData()); + dto.setAirVendor(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue()); + dto.setAirType(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue()); + return dto; } + } else if ("waypoints".equals(fileExtension)) { + // 直接处理Waypoints文件 + AirlineFileDTO dto = new AirlineFileDTO(); + // 去除文件名中的后缀名 + int pos = originalFilename.lastIndexOf("."); + String fileNameWithoutExtension = pos > 0 ? originalFilename.substring(0, pos) : originalFilename; + List airlineFiles =iAirlineFileDomain.selectFileNameLike(fileNameWithoutExtension); + + List fileNames = airlineFiles.stream().map(AirlineFile::getName).toList(); + String newFileName = FileUtils.generateUniqueFileName(fileNameWithoutExtension, fileNames); + dto.setFileName(newFileName); + + // 直接读取文件内容并上传 + R fileUrl = remoteFileService.uploadFileByData(UUID.randomUUID().toString(), "waypoints", Arrays.toString(file.getBytes())); + dto.setFileUrl(fileUrl.getData()); + dto.setAirVendor(""); + dto.setAirType(""); + return dto; + } else { + throw new BaseException("不支持的文件格式,请上传KMZ或Waypoints文件"); } - - if (Objects.isNull(kmlInfo)) { - throw new BaseException("kmz文件内容缺失"); - } - String globalHeight = kmlInfo.getDocument().getFolder().getGlobalHeight(); - R fileUrl = remoteFileService.uploadFileByData(UUID.randomUUID().toString(), "waypoints", WayPointUitls.kmz2waypoint(kmlInfo)); - AirlineFileDTO dto = new AirlineFileDTO(); - // 去除文件名中的后缀名 - String fileName = file.getName(); - int pos = fileName.lastIndexOf("."); - String fileNameWithoutExtension = pos > 0 ? fileName.substring(0, pos) : fileName; - List airlineFiles =iAirlineFileDomain.selectFileNameLike(fileNameWithoutExtension); - - - List fileNames = airlineFiles.stream().map(AirlineFile::getName).toList(); - String newFileName = FileUtils.generateUniqueFileName(fileNameWithoutExtension, fileNames); - dto.setFileName(newFileName); - dto.setFileUrl(fileUrl.getData()); - dto.setAirVendor(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue()); - dto.setAirType(kmlInfo.getDocument().getKmlMissionConfig().getDroneInfo().getDroneEnumValue()); - return dto; - } catch (IOException e) { - throw new BaseException("Waypoints文件生成失败"); + throw new BaseException("文件处理失败"); } catch (Exception e) { - log.error("kmz航线转换失败", e); - throw new BaseException("kmz航线转换失败"); + log.error("航线文件处理失败", e); + throw new BaseException("航线文件处理失败"); } }