You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Foundry中用TypeScript验证本体对象类型的附件上传?

在Ontology Function Backed Action中实现文件上传前的内容验证(TypeScript)

核心思路

在原有的文件上传动作逻辑中插入前置验证步骤:先读取上传文件的内容,执行自定义的验证规则,只有验证通过后才将文件保存到Ontology对象的attachment属性;验证失败则直接抛出错误终止流程。

具体实现步骤

1. 准备依赖与类型定义

根据Ontology的运行环境,引入对应的文件处理工具(Node.js环境用fs/buffer,前端环境用FileReader),同时导入Ontology SDK相关类型:

// 导入Ontology SDK类型(根据实际SDK调整)
import { OntologyObject, AttachmentService } from '@your-ontology-sdk';
// Node.js环境文件处理模块
import { readFileSync } from 'fs';

2. 编写自定义验证函数

根据需求编写验证逻辑,以下是两个常见场景的示例:

示例1:验证文本文件包含特定关键词

/**
 * 验证文件内容是否包含指定关键词
 * @param fileContent 文件内容字符串
 * @param targetKeyword 要检测的关键词
 * @returns 验证结果
 */
function validateFileContainsKeyword(fileContent: string, targetKeyword: string): boolean {
  return fileContent.includes(targetKeyword);
}

示例2:验证CSV文件包含指定列

/**
 * 验证CSV文件是否包含指定列
 * @param csvContent CSV内容字符串
 * @param requiredColumns 必须存在的列名数组
 * @returns 验证结果
 */
function validateCSVColumns(csvContent: string, requiredColumns: string[]): boolean {
  const headerRow = csvContent.split('\n')[0].trim();
  const existingColumns = headerRow.split(',').map(col => col.trim());
  return requiredColumns.every(col => existingColumns.includes(col));
}

3. 改造Function Backed Action逻辑

将验证步骤嵌入原上传动作,完整代码示例:

/**
 * 带内容验证的文件上传动作
 * @param ontologyObject 目标Ontology对象
 * @param file 待上传的文件(Node.js为路径/Buffer;前端为File对象)
 * @param validationConfig 验证配置
 */
async function uploadFileWithValidation(
  ontologyObject: OntologyObject,
  file: string | Buffer | File,
  validationConfig: { type: 'keyword' | 'csv-columns'; value: string | string[] }
): Promise<void> {
  // 1. 读取文件内容
  let fileContent: string;
  if (typeof file === 'string') {
    // Node.js环境:从路径读取
    fileContent = readFileSync(file, 'utf-8');
  } else if (file instanceof Buffer) {
    // Buffer转字符串
    fileContent = file.toString('utf-8');
  } else if (file instanceof File) {
    // 前端环境:异步读取文件
    fileContent = await new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => resolve(reader.result as string);
      reader.onerror = reject;
      reader.readAsText(file);
    });
  } else {
    throw new Error('不支持的文件类型');
  }

  // 2. 执行验证逻辑
  let isValid = false;
  switch (validationConfig.type) {
    case 'keyword':
      isValid = validateFileContainsKeyword(fileContent, validationConfig.value as string);
      if (!isValid) throw new Error(`文件未包含必填关键词:${validationConfig.value}`);
      break;
    case 'csv-columns':
      isValid = validateCSVColumns(fileContent, validationConfig.value as string[]);
      if (!isValid) throw new Error(`CSV文件缺少必填列:${(validationConfig.value as string[]).join(', ')}`);
      break;
    default:
      throw new Error('不支持的验证类型');
  }

  // 3. 验证通过,执行原上传逻辑
  await AttachmentService.upload(ontologyObject.id, file, ontologyObject.attachment);
}

4. 错误处理与调用示例

调用动作时捕获验证失败的错误,返回给前端或日志系统:

try {
  await uploadFileWithValidation(
    targetOntologyObject,
    './user-data.csv',
    { type: 'csv-columns', value: ['user_id', 'username', 'email'] }
  );
  console.log('文件上传成功');
} catch (error) {
  console.error('上传失败:', (error as Error).message);
  // 可在此返回错误给前端或触发告警
}

注意事项

  • 根据Ontology运行环境调整文件读取方式(前端/Node.js存在差异)
  • 验证逻辑可按需扩展(比如正则匹配、JSON Schema校验等)
  • 大文件建议用流式读取验证,避免内存溢出

内容的提问来源于stack exchange,提问作者Aniket Pande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:31:21