========== 测试逗号分隔文件ID处理 ========== 测试场景说明: 数据库中的文件ID字段可能包含多个ID,用逗号分隔,例如: BusinessLicensePic: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,ff83a66a-33d3-4447-b7ee-137f1534659f' 系统需要逐个查询这些ID,找到第一个存在且可访问的文件 测试用例: 1. 单个文件ID 输入: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8' 预期: 应该查询单个ID 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8] 2. 两个文件ID 输入: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8,ff83a66a-33d3-4447-b7ee-137f1534659f' 预期: 应该逐个查询,返回第一个存在的文件 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 3. 包含空格的文件ID 输入: '20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f' 预期: 应该自动去除空格 解析结果: [20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f] 4. 三个文件ID 输入: 'id1,id2,id3' 预期: 应该逐个查询,返回第一个存在的文件 解析结果: [id1, id2, id3] 5. 空字符串 输入: '' 预期: 应该返回null 解析结果: [] 6. 包含空ID 输入: 'id1,,id3' 预期: 应该跳过空ID 解析结果: [id1, id3] 实际处理逻辑: 1. 使用explode(',', $fileIds)按逗号分割 2. 使用array_map('trim', $array)去除每个ID的空格 3. 逐个调用getFileById()查询文件记录 4. 对每个找到的文件,使用HTTP HEAD请求检查文件是否存在 5. 返回第一个存在且可访问的文件 6. 如果所有文件都不可用,返回null 文件存在性检查: 使用cURL发送HTTP HEAD请求到文件URL - HTTP 200: 文件存在 - 其他状态码: 文件不存在或不可访问 - 超时时间: 10秒 - 支持重定向跟随 日志输出示例: [INFO] 查询营业执照文件,ID列表: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8, ff83a66a-33d3-4447-b7ee-137f1534659f [INFO] 查询到文件: business_license.jpg [INFO] 找到可用的营业执照文件: business_license.jpg (ID: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8) 或者: [WARNING] 营业执照文件记录存在但文件不可访问: old_license.jpg (ID: 20f3262a-9cbb-4be1-9504-50d1dd1a1cf8) [INFO] 找到可用的营业执照文件: new_license.jpg (ID: ff83a66a-33d3-4447-b7ee-137f1534659f) 错误处理: 如果所有文件ID都不可用,系统会: 1. 记录错误日志: '所有营业执照文件都不可用,ID列表: {fileIds}' 2. 返回null 3. 在VATDocumentGenerator中触发严格验证异常 优势: ✅ 支持多个备用文件,提高成功率 ✅ 自动跳过不存在或不可访问的文件 ✅ 详细的日志记录,便于问题排查 ✅ 兼容原有的单文件ID格式 ✅ 实际验证文件可访问性,避免下载时失败 ========== 测试完成 ========== 使用建议: 1. 在数据库中配置多个备用文件ID,用逗号分隔 2. 将最新或最优质的文件ID放在前面 3. 定期清理无效的文件ID 4. 监控日志中的文件不可访问警告