注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
TypeScript v1 関数は、メモリーに厳格な上限がある環境で実行されます。ファイルデータを扱うと、このメモリー上限をすぐに超える可能性があります。そのため、扱う添付ファイルは 20MB 未満に限定することを推奨します。Python および TypeScript v2 関数のデフォルトの上限は 1GB で、Ontology Manager で調整できます。
添付ファイルは、オブジェクトプロパティのように機能するファイルです。添付ファイルは一時ファイルとしてアップロードされ、アクションを使用してオブジェクトにアタッチされます。オブジェクトにアタッチされると、添付ファイルは永続化され、ほかのプロパティと同様にアクセスできるようになります。
添付ファイルは、アクションから関数への入力として渡すことも、オブジェクトのプロパティとしてアクセスすることもできます。また、関数内で添付ファイルを作成して返すこともできます。
Python を使用する場合、添付ファイルは API Gateway を使用して管理します。Python オントロジー SDK には添付ファイルのデータ型が用意されています。添付ファイルを参照してください。
言語別の添付ファイルのインポート構文は次のとおりです。
Copied!1import { Attachment } from "@foundry/functions-api";
Copied!1import { Attachment } from "@osdk/functions";
Copied!1 2# 利便性のため、オントロジー SDK の Attachment データ型は Python 関数の `functions.api` パッケージから再エクスポートされています。 from functions.api import Attachment
添付ファイルには、生データを読み取るための読み取りメソッドが用意されています。このメソッドのシグネチャは次のとおりです。
Copied!1 2 3// Blob は JavaScript の標準データ型で、不変の生データからなるファイルのようなオブジェクトを表します。 // https://developer.mozilla.org/en-US/docs/Web/API/Blob readAsync(): Promise<Blob>;
Copied!1 2 3// Response インターフェースは Fetch API の一部で、TypeScript v2 環境では `undici` によって提供されます。 // https://developer.mozilla.org/en-US/docs/Web/API/Response fetchContents(): Promise<Response>;
Copied!1 2 3# BytesIO は Python の標準データ型で、バイナリストリームを表します。 # https://docs.python.org/3/library/io.html#io.BytesIO def read(self) -> BytesIO: ...
複雑なファイル形式を扱うには、ライブラリを使用するか、独自のカスタムコードを記述する必要がある場合があります。たとえば、PDF は適切なライブラリでパースする必要があります。関数リポジトリへの依存関係の追加について詳しくはこちら。
オントロジーのオブジェクトを一括で作成または更新するには、Excel ファイルを添付ファイルパラメーターとして受け取り、その行をパースします。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32import { Attachment, OntologyEditFunction, Edits } from "@foundry/functions-api"; import { MyObjectType } from "@foundry/ontology-api"; import * as XLSX from "xlsx"; interface ExcelRow { [key: string]: string | number | null; } @OntologyEditFunction() @Edits(MyObjectType) public async processExcelUpload(file: Attachment): Promise<void> { // ファイルを Blob として読み込みます const blob: Blob = await file.readAsync(); // Blob を ArrayBuffer に変換します const arrayBuffer = await blob.arrayBuffer(); // SheetJS を使用して Excel ファイルをパースします const workbook = XLSX.read(arrayBuffer, { type: 'array' }); // 最初のシートを取得します const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; // ワークシートを JSON の行に変換します const data = XLSX.utils.sheet_to_json(worksheet, { defval: null }) as ExcelRow[]; // 各行を処理して、オブジェクトを作成または更新します for (const row of data) { // 行データに基づいてオントロジーのオブジェクトを作成または更新します } }
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24from io import BytesIO import pandas as pd from functions.api import function, Attachment, OntologyEdit from ontology_sdk import FoundryClient from ontology_sdk.ontology.objects import MyObjectType @function(edits=[MyObjectType]) def process_excel_upload(excel_file: Attachment) -> list[OntologyEdit]: client = FoundryClient() ontology_edits = client.ontology.edits() # アップロードされた Excel ファイルを読み込みます sheet_data: BytesIO = excel_file.read() df = pd.read_excel(sheet_data) # 各行を処理して、オブジェクトを作成または更新します for _, row in df.iterrows(): new_obj = ontology_edits.objects.MyObjectType.create(str(row["id"])) new_obj.property_a = row["column_a"] new_obj.property_b = row["column_b"] return ontology_edits.get_edits()
複数のファイルのアップロードを受け付けるには、パラメーターのデータ型として Attachment[](TypeScript)または list[Attachment](Python)を使用します。xlsx(SheetJS)や pandas などのライブラリについては、依存関係を追加するを参照してください。
TypeScript v1 関数はファイルシステムをサポートしていません。ファイルデータのパースに関連する依存関係は、関数の環境では利用できない fs モジュールに依存していることがよくあります。この制限により、コンパイル時や実行時に fs モジュールのエラーが発生する場合があります。この制限を回避するには、インメモリーファイルシステム(たとえば memfs)への依存関係を導入し、その依存関係に fs という名前のエイリアスを設定します。
次の例では、package.json ファイルで NPM の依存関係 memfs を使用しています。
Copied!1"fs": "npm:memfs@^x.x.x"
関数を使用して添付ファイルを作成し、オブジェクトにアタッチすることもできます。関数内で作成した添付ファイルを永続化するには、その関数で添付ファイルをオブジェクトにリンクするオントロジーの編集を行う必要があります。
オブジェクトにアタッチされていない添付ファイルは、アップロードしたユーザーのみが閲覧でき、一定期間が経過すると自動的に削除されます。
TypeScript v2 関数は添付ファイルの作成をサポートしていません。
添付ファイルを作成するには、添付ファイルのアップロード関数を使用します。言語別のアップロード関数のシグネチャは次のとおりです。
Copied!1 2 3 4import { Attachments, Attachment } from "@foundry/functions-api"; // Attachments 上のメソッド: uploadFile(filename: string, blob: Blob): Promise<Attachment>;
Copied!1 2 3 4 5 6from ontology_sdk import FoundryClient from foundry_sdk_runtime.attachments import AttachmentMetadata # FoundryClient 上のメソッド: def upload(file_path: str, attachment_name: str) -> AttachmentMetadata: ... # `file_path` はアップロードするローカルファイルです。
次の例は、ファイルをアップロードし、作成された添付ファイルをオブジェクトに割り当てる手順を示しています。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15import { Attachments, Attachment, OntologyEditFunction } from "@foundry/functions-api"; @OntologyEditFunction() public async updateMaintenanceLog(aircraft: Aircraft): Promise<void> { const aircraftMaintenanceLogData: Blob = await aircraft.maintenanceLog.readAsync(); const completedMaintenanceLogData: Blob = await completedMaintenanceLog.readAsync(); // `Blob` オブジェクトの作成には、ライブラリやカスタムコードが必要になる場合が多く、このオブジェクトは // `uploadFile` メソッドにパラメーターとして渡されます。 // 現在の航空機ログと完了したログを比較して、新しい整備ログを作成します。 const updatedMaintenanceLogData: Blob; aircraft.maintenanceLog = await Attachments.uploadFile("maintenance-log.txt", updatedMaintenanceLogData); }
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35from io import BytesIO from functions.api import function, Attachment, OntologyEdit from ontology_sdk import FoundryClient from ontology_sdk.ontology.objects import Aircraft @functions(edits=[Aircraft]) def update_maintenance_log( aircraft: Aircraft, completed_maintenance_log: Attachment ) -> list[OntologyEdit]: client = FoundryClient() ontology_edits = client.ontology.edits() maintenance_log_data: BytesIO = aircraft.maintenance_log.read() completed_maintenance_log_data: BytesIO = completed_maintenance_log.read() # 現在の航空機ログと完了したログを比較して、新しい整備ログを作成します updated_maintenance_log_data: BytesIO = get_updated_maintenance_log( maintenance_log_data, completed_maintenance_log_data ) editable_aircraft = ontology_edits.objects.Aircraft.edit(aircraft) with open("updated-maintenance-log.txt", "wb") as f: f.write(updated_maintenance_log_data.getbuffer()) editable_aircraft.maintenance_log = client.ontology.attachments.upload( "updated-maintenance-log.txt", "my_attachment" ) return ontology_edits.get_edits()