[CAIレシピ] ファイルアップロードとSecure Agent環境への保存(multipart/form-data)

## はじめに

この記事では、CAIプロセスの実行を通じて、Secure Agent環境にファイルをアップロード(保存)する実装を確認します。

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)
- [プロセスオブジェクトによるユーザー定義変数の利用](https://qiita.com/shunsuzu/private/70f1c56f95536645e62f)
- [CAIでXQueryを利用する時に覚えておきたいこと](https://qiita.com/shunsuzu/private/00f351d0ab9896fa36dc)
- [テキストファイルの作成](https://qiita.com/shunsuzu/private/7b460174a8da9a31c228)

## ファイルアップロードとSecure Agent環境への保存(multipart/form-data)

### CAI プロセスの作成

次の手順では、テキストファイルを multipart/form-data としてアップロードして[テキストファイルの作成](https://qiita.com/shunsuzu/private/7b460174a8da9a31c228)で定義したアプリケーション接続 __recipe-appConn-FileWrite__ のイベント __File Writer__ を使ってSecure Agent環境に保存するCAIプロセスを作成しています


1. CAIプロセスを次の設定で作成します。
    - 名前を __recipe-pca-fileUploadMultipart__ とする
    - __匿名アクセス__ を許可する
    - __クラウドサーバー__ にデプロイする

1. 入力フィールド __inputAttach__ を __タイプ=添付(Attachment)__ として定義します。

1. 一時フィールドとして __tmpFile__ を定義します。__定義された接続タイプ__ にはアプリケーション接続 __recipe-appConn-FileWrite__ を指定、__タイプ__ として __File Write Task__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/849ebfc8-f086-3c07-d532-ea1d512e7362.png)

1. 出力フィールドとして __output__ を定義します。__定義された接続タイプ__ にはアプリケーション接続 __recipe-appConn-FileWrite__ を指定、__タイプ__ として __Delimited Content Serialization Result__ を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/09229f83-e1d7-4de8-0a94-3d54fb7789fc.png)

1. CAIプロセスが次の順に実行されるように各種ステップを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/3407f45d-cb94-6d3a-27c4-1472a1d3ec46.png)


1. 割り当てステップを選択して、次のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/96d01d8e-b411-8bb2-1384-e52917285dd6.png)
計算式 `sff:getAttachmentName($input.inputAttach)` はアップロードしたファイル名を取得しています。

1. サービスステップの __サービス__ タブを選択して __サービスタイプ=接続__、__接続=recipe-appConn-FileWrite__、__アクション=FileWriter__ を指定します。

1. サービスステップの __入力フィールド__ タブを選択して、次のように設定します(Attachmentフィールドは、フィールドの追加ボタンをクリックして追加します)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/1fbbbb47-2aa3-fe64-1009-0e494b69d134.png)








### CAIプロセスの実行

curlコマンドを例とした動作確認結果です。ファイルのアップロードが行えている動作を確認できます。なお、curlの-Fオプションを使用しているため、HTTPリクエスト時のContent-Typeはmultipart/form-dataによりファイルのアップロード処理が実行されています。

```:curlコマンドと実行結果
//アップロード用のテキストファイル作成
echo "HelloWorld" > /opt/infaUSW5/ff/recipe-fileUploadMultipart.txt

//curlによるCAIプロセスの実行
curl https://<---ご利用のIICS/CAIサーバー--->recipe-psa-fileUploadMultipart \
> -F "inputAttach=@/opt/infaUSW5/ff/recipe-fileUploadMultipart.txt"

//実行結果の確認
$ cat /opt/infaUSW5/ff/tgt/recipe-fileUploadMultipart.txt
HelloWorld
```

興味深いポイントは、今回は、CAIプロセスのデプロイ先を __クラウドサーバー__ としていましたが、実際にファイルが保存されている場所はSecure Agent実行環境という点です。これはアプリケーション接続がSecure Agentで動いていることに起因した動作です。

Secure Agentにファイルを保存したい場合であっても、必ずしもCAIプロセスをSecure Agentにデプロイする必要はありません。

## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)