CData Arc で HCL Domino/Notes の添付ファイルを Amazon S3 へ自動転送する

by 杉本雄太 | September 15, 2026

こんにちは。CData Software Japan の杉本です。 

長年にわたって業務を支えてきた HCL Domino / Notes には、案件情報や申請文書とともに、大量の添付ファイルが蓄積されています。見積書、仕様書、構成図など、これらは Domino の文書内に埋め込まれているため、Domino クライアントを開かないと参照できません。本記事では、CData Arc と CData Domino Driver を組み合わせて、Domino 文書の添付ファイルを Amazon S3 へ自動転送するフローを解説します。

シナリオ

営業案件を管理する Domino データベース(Proposal フォーム)から、提案書・見積書・構成図などの添付ファイルを抽出し、案件ごとに Amazon S3 へ転送します。例えば、S3 へ転送した後は以下のブログ記事のように生成AI 利用なども可能です。

CData Arc × Amazon Bedrock で社内ナレッジ RAG を構築する

前提条件

CData Domino Driver はDomino REST API を利用します。Domino REST APIの環境構築・スキーマ・スコープの設定については、以下の連載記事を参考にしてください。

HCL Domino REST API の使い方:① 環境構築編

HCL Domino REST API の使い方:② スキーマ・スコープ構成編

HCL Domino REST API の使い方:③REST API をPostman で触ってみる

HCL Domino REST API の使い方:④ CData Driver・Tableau 接続編

Step 1. CData Domino コネクタで Domino から文書を取得する

今回実際の取得対象のDomino側のデータは以下になります。こちらのデータでは4つのファイルが添付されています。

ますCData Arc からDomino Driverを利用するためにインストールを行います。設定 > 接続より CData Domino コネクタのインストールを行います。

コネクタのインストール完了後は、ワークスペース内でCData Dominoコネクタが利用可能になります。

CData Domino コネクタのSelect アクションを追加して、Domino への接続設定を作成します。

Action タブに移動して、Proposal テーブルを取得します。

テーブル名を右クリックしてテーブル設定を選択、添付ファイルが存在するレコードのみ取得するようにフィルタ条件を指定します。

そして取得結果は 1 レコード 1 ファイルの XML として後続へ流れます。出力される XML は次のような構造になります(値は説明用に加工しています)。

<Items>
  <Proposal>
    <unid>4A2E147E82B4827900258E4000464E4E</unid>
    <title>DL-900リプレース最終提案 v3</title>
    <account_name>北斗商事株式会社</account_name>
    <opportunity_no>OPP-2026-041</opportunity_no>
    <amount>16800000</amount>
    <status>提案中</status>
    <submitted_date>2026-07-16T00:00:00.0000+09:00</submitted_date>
    <_FILES>[ "proposal_OPP-2026-041_v3.pdf", "quote_OPP-2026-041_v3.xlsx",
              "system-diagram_OPP-2026-041.png", "spec-notes_OPP-2026-041.txt" ]</_FILES>
    <body>{"type":"multipart/form-data","encoding":"BASE64","content":"TUlNRS1WZXJ..."}</body>
  </Proposal>
</Items>

ここで注目すべきは 2 つのカラムです。

  • _FILES — その文書が持つ添付ファイル名の一覧(JSON 配列)。抽出結果の検証に使えます。

  • body — リッチテキスト項目。JSON でラップされておりcontent には Base64 エンコードされた(MIME メッセージmultipart/related)が入っています。

添付ファイルの実体は、この body の中にあります。つまり、Domino の添付ファイルを取り出すには「JSON を開く → Base64 をデコードする → MIME を分解する」という三段構えの処理が必要になります。

デコードした MIME の中身は次のような構成です。

パート

 Content-Disposition

内容

1

inline

リッチテキスト本文(HTML)

2 - 5

attachment

添付ファイル(Base64)

各添付パートには filename="..." が付いているので、元のファイル名と拡張子を保ったまま取り出すことができます。

Step 2. Script コネクタで MIME を分解し、添付ファイルを復元する

ここが本記事の中心です。Script コネクタに以下の ArcScript を設定します。

<!-- 0. 一時出力先(事前に存在させておくこと。末尾の区切り文字まで含める) -->
<arc:setc attr="cfg.outdir" value="C:\Arc\temp\domino\" />

<!-- 1. XML から unid と body(JSON文字列) を取得 -->
<arc:set attr="xml.uri" value="[FilePath]" />
<arc:set attr="xml.map:unid" value="/Items/Proposal/unid" />
<arc:set attr="xml.map:bodyjson" value="/Items/Proposal/body" />

<arc:call op="xmlDOMGet" in="xml" out="result">
  <!-- 2. body 列の JSON 文字列から content(Base64本体) だけを取り出す -->
  <arc:set attr="json.text" value="[result.bodyjson]" />
  <arc:set attr="json.map:content" value="/json/content" />
  <arc:call op="jsonDOMGet" in="json" out="jsonResult">

    <!-- 3. Base64 をデコードし、MIME 実体(multipart/related)に戻す -->
    <arc:set attr="enc.data" value="[jsonResult.content]" />
    <arc:set attr="enc.format" value="BASE64" />
    <arc:call op="encDecode" in="enc" out="decoded">
      <arc:set attr="mime.text" value="[decoded.decodeddata | replace('\r\n', '\n')]" />

      <!-- 4. boundary 文字列を抽出し、全パート数を算出 -->
      <arc:set attr="mime.boundary" value="[mime.text | regexmatch('boundary=(\[^\r\n;\]+)', 1)]" />
      <arc:set attr="mime.partcount" value="[mime.text | count('--[mime.boundary]') | add(1)]" />

      <!-- 5. 全パートをループし、添付ファイルパートだけを個別保存 -->
      <arc:enum range="1..[mime.partcount]">
        <arc:set attr="part.raw" value="[mime.text | split('--[mime.boundary]', [_value])]" />

        <arc:if exp="[part.raw | find('Content-Disposition: attachment')] &gt;= 0">
          <!-- filename="..." から元のファイル名を取り出す -->
          <arc:set attr="part.afterFilename" value="[part.raw | split('filename=&quot;', 2)]" />
          <arc:set attr="part.filename" value="[part.afterFilename | split('&quot;', 1) | tofilename()]" />

          <!-- ヘッダーと本文の境界(空行)以降が Base64 本体 -->
          <arc:set attr="part.body" value="[part.raw | split('\n\n', 2)]" />

          <arc:set attr="attach.data" value="[part.body]" />
          <arc:set attr="attach.format" value="BASE64" />
          <!-- ★ outfile 指定でデコード結果を文字列化せず、バイナリのままファイルへ書き出す -->
          <arc:set attr="attach.outfile" value="[cfg.outdir][result.unid]_[part.filename]" />

          <arc:call op="encDecode" in="attach" out="attachDecoded">
            <!-- 後続の S3 コネクタへ渡す -->
            <arc:set attr="output.filepath" value="[attachDecoded.outfile]" />
            <arc:set attr="output.filename" value="[result.unid]_[part.filename]" />
            <arc:push item="output" />
          </arc:call>
        </arc:if>

      </arc:enum>
    </arc:call>
  </arc:call>
</arc:call>

処理の流れを整理します。

  1. xmlDOMGetunid(文書の一意キー)と body を取り出す

  2. jsonDOMGetbody の JSON から content(Base64)を取り出す

  3. encDecode で Base64 をデコードし、MIME テキストに戻す

  4. Content-Type ヘッダーから boundary を正規表現で抽出し、パート数を数える

  5. 各パートをループしContent-Disposition: attachment を含むパートだけを、元のファイル名で個別ファイルとして書き出す

ファイル名は [unid]_[元のファイル名] としています。Domino では別文書に同名の添付が存在しうるためunid を前置して衝突を防いでいます。

Step 3. Amazon S3 コネクタでクラウドストレージへ転送する

Script コネクタから流れてきたファイルを、S3 コネクタを利用して指定のS3 バケットへアップロードします。

Amazon S3 以外にも、Arc には Azure Blob コネクタ、Box コネクタ、Google Drive コネクタ、SharePointコネクタ など各種クラウドストレージのコネクタが用意されています。Script コネクタまでの処理は共通で、最後のコネクタを差し替えるだけで転送先を変更できるのが Arc の利点です。

実行結果

最終的に作成が完了したフローが以下になります。

フローを実行すると、S3 バケットに以下のファイルが配置されます。PDF・XLSX・PNG などのファイルが、それぞれのアプリケーションで正常に開けることも確認してください。

Step 4: 一時出力先ファイルの定期クリーンアップ

Script コネクタで利用している一時出力先のフォルダの中身は定期的に削除しておきます。

<!-- 0. 削除対象ディレクトリと保持期間(時間) ※必要に応じて調整 -->
<arc:setc attr="cfg.tempdir" value="C:\Arc\temp\domino\" />

<!-- 削除件数カウンタと結果レポート本文の初期化 -->
<arc:set attr="stats.deletedcount" value="0" />
<arc:set attr="output.data" value="tempdir=[cfg.tempdir] executed_at=[_ | now('yyyy-MM-dd HH:mm:ss')]\nstatus,fullname,mtime" />

<!-- 今日の日付を yyyyMMdd の数値として取得 -->
<arc:set attr="cfg.today" value="[_ | now('yyyyMMdd')]" />

<!-- 1. 一時フォルダ内のファイルを列挙(サブフォルダは対象外) -->
<arc:set attr="input.path" value="[cfg.tempdir]" />
<arc:set attr="input.recurse" value="false" />
<arc:set attr="input.fileordir" value="files" />

<arc:call op="fileListDir" in="input" out="result">

  <!-- 2. mtimeの時刻部分を無視し、日付だけを yyyyMMdd の数値に変換する -->
  <arc:set attr="result.filedate" value="[result.file:mtime | dateadd('day', 0, 'yyyyMMdd')]" />

  <!-- 3. ファイルの日付が「今日より前」なら削除対象(=日付が変わっていれば削除) -->
  <arc:if exp="[result.filedate | lessthan([cfg.today])]">

    <arc:set attr="del.file" value="[result.file:fullname]" />
    <arc:call op="fileDelete" in="del" out="delResult">
      <arc:set attr="stats.deletedcount" value="[stats.deletedcount | add(1)]" />
      <arc:set attr="output.data" value="[output.data]\nDELETED,[result.file:fullname],[result.file:mtime]" />

      <arc:catch code="*">
        <arc:set attr="output.data" value="[output.data]\nFAILED,[result.file:fullname],[result.file:mtime] (error: [_description])" />
      </arc:catch>
    </arc:call>

  <arc:else>
    <arc:set attr="output.data" value="[output.data]\nSKIPPED,[result.file:fullname],[result.file:mtime]" />
  </arc:else>
  </arc:if>

</arc:call>

<!-- 4. サマリー行を追記 -->
<arc:set attr="output.data" value="[output.data]\n\n合計削除件数: [stats.deletedcount]" />

<!-- 5. レポートをアウトプットファイルとして書き出す -->
<arc:set attr="output.filename" value="cleanup_report_[_ | now('yyyyMMdd_HHmmss')].txt" />
<arc:push item="output" />

まとめ

CData Arc と CData Domino Driver を組み合わせることで、Domino に蓄積された添付ファイルを、ノーコード+わずかな ArcScript でクラウドストレージへ自動転送できます。

本記事のポイントを再掲します。

  • Domino の添付ファイルは、リッチテキスト項目の中に JSON → Base64 → MIME の三重構造で格納されている

  • MIME の各パートから filename="..." を読み取ることで、元のファイル名・拡張子のまま取り出せる

  • 転送先は最後のコネクタを差し替えるだけで、S3 / Azure Blob / Box / Google Drive などに変更できる

CData Arc とCData Domino コネクタは 30 日間の無償トライアルをご利用いただけます。ぜひ実際の環境でお試しください。

この記事では CData Arc™ 2026 - 26.3.9736.0 を利用しています。