diff --git a/config/application-external.yml b/config/application-external.yml index f0b78a0..d8e28c6 100644 --- a/config/application-external.yml +++ b/config/application-external.yml @@ -34,9 +34,10 @@ ftp-sync: # 字段分隔符(老系统用※) field-separator: "※" - # OSS 文件上传配置 + # ============================== OSS文件存储服务 ======================= oss: - base-url: http://53.1.211.7/apiOss + base-url: http://53.1.211.7:8090 + upload-path: voice/record/ # 地市FTP配置(每个地市独立部署一份,只配当前地市即可) cities: diff --git a/src/main/java/com/threecloud/dataserviceyy/service/FtpSyncService.java b/src/main/java/com/threecloud/dataserviceyy/service/FtpSyncService.java index 25a71b4..2ef37e8 100644 --- a/src/main/java/com/threecloud/dataserviceyy/service/FtpSyncService.java +++ b/src/main/java/com/threecloud/dataserviceyy/service/FtpSyncService.java @@ -163,7 +163,8 @@ public class FtpSyncService { } } catch (Exception e) { fileFail++; - logger.error("【FTP地市】处理文件失败: {}, 原因={}", fileName, e.getMessage()); + logger.error("【FTP地市】处理文件严重失败: {}, 原因={}。将终止本轮同步以防止连接断开导致后续文件持续报错。", fileName, e.getMessage()); + break; } } logger.info("【FTP地市】{} 同步完成: 成功{}个文件, 跳过{}个(已处理), 失败{}个文件", diff --git a/src/main/java/com/threecloud/dataserviceyy/util/FileUploadUtil.java b/src/main/java/com/threecloud/dataserviceyy/util/FileUploadUtil.java index 9c33ebe..809f78e 100644 --- a/src/main/java/com/threecloud/dataserviceyy/util/FileUploadUtil.java +++ b/src/main/java/com/threecloud/dataserviceyy/util/FileUploadUtil.java @@ -33,7 +33,7 @@ public class FileUploadUtil { private static final Logger logger = LoggerFactory.getLogger(FileUploadUtil.class); - @Value("${ftp-sync.oss.base-url:http://53.1.211.7/apiOss}") + @Value("${ftp-sync.oss.base-url:http://53.1.211.7:8090}") private String ossBaseUrl; private RestTemplate restTemplate; @@ -57,6 +57,12 @@ public class FileUploadUtil { */ public String uploadWav(String ossPath, String fileName, byte[] fileData) { String path = "voice/" + ossPath; + if (fileName != null && !fileName.isEmpty() && path.endsWith(fileName)) { + path = path.substring(0, path.length() - fileName.length()); + } + if (path.endsWith("/")) { + path = path.substring(0, path.length() - 1); + } logger.debug("上传文件到OSS, path={}, 大小={} bytes", path, fileData.length); try { @@ -76,21 +82,39 @@ public class FileUploadUtil { HttpEntity> requestEntity = new HttpEntity<>(body, headers); - ResponseEntity response = restTemplate.exchange( + ResponseEntity response = restTemplate.exchange( ossBaseUrl + "/oss/upload", HttpMethod.POST, requestEntity, - ResultEntity.class + String.class ); if (response.getStatusCode().is2xxSuccessful() && response.getBody() != null) { - ResultEntity result = response.getBody(); - if (result.getCode() == ResultEntity.StatusCode.SUCCESS.getCode()) { + String responseBody = response.getBody(); + logger.info("文件上传响应原始数据: {}", responseBody); + + // 优先检查是否直接返回了包含 fileUrl 或 url 的对象(兼容扁平格式) + if (responseBody.trim().startsWith("{")) { + try { + Map map = JSON.parseObject(responseBody, Map.class); + if (map != null && (map.containsKey("fileUrl") || map.containsKey("url"))) { + String fileUrl = parseFileUrl(responseBody); + logger.info("文件上传完成 (扁平格式), URL: {}", fileUrl); + return fileUrl; + } + } catch (Exception e) { + logger.debug("尝试直接解析为Map失败: {}", e.getMessage()); + } + } + + // 否则按照 ResultEntity 包装格式解析(兼容旧包装格式) + ResultEntity result = JSON.parseObject(responseBody, ResultEntity.class); + if (result != null && result.getCode() != null && result.getCode() == ResultEntity.StatusCode.SUCCESS.getCode()) { String fileUrl = parseFileUrl(result.getContent()); - logger.info("文件上传完成, URL: {}", fileUrl); + logger.info("文件上传完成 (包装格式), URL: {}", fileUrl); return fileUrl; } else { - throw new RuntimeException("上传失败, code=" + result.getCode() + ", msg=" + result.getMsg()); + throw new RuntimeException("上传失败, 原始响应=" + responseBody + ", code=" + (result != null ? result.getCode() : "null") + ", msg=" + (result != null ? result.getMsg() : "null")); } } else { throw new RuntimeException("上传失败, HTTP状态码: " + response.getStatusCode());