DataSpiderでBase64エンコードされたJPEGファイルをデコードしてみた

# はじめに
こんにちは。すぎもんです。😀
DataSpider Servistaを使用して、Base64エンコードされたJPEGファイルをデコードしてみました。

:::note info
DataSpiderを用いて画像認証サービスへ連携する際に以下のような処理手順が必要な場合に利用します。

1．スマートフォンアプリ→DataSpiderへBase64エンコードされたデータを送信
2．**DataSpiderのスクリプトで画像ファイルへデコード**
3．連携先画像認証サービスの指定の暗号化形式で画像ファイルを再暗号化
4. Amazon Rekognition等画像認識サービスへの連携
:::

本記事ではメインに**2.DataSpiderのスクリプトで画像ファイルへデコード**、HTTPトリガーで受信したBase64データをJPEG画像ファイルを画像へ変換する方法を紹介します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0c2b6792-b3a0-c79c-a36c-bca49d4e8bca.png)

# 今回やること

DataSpiderで以下の検証を実施します
1.HTTPトリガーでBase64データをJSON形式で受信
2.スクリプトでBase64データをJPEGファイルへデコード

# 検証手順
## DataSpiderの設定

### 1.JPEG生成スクリプトの作成
検証用のプロジェクトとスクリプトを新規作成していきます。
DataSpider Studioのデスクトップから **「新規プロジェクト」** を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b13f902d-99b5-839a-30de-1b7e30fae6cf.png)
**[プロジェクト名]** フィールドに任意の名前、今回は`TESTJPEG`と入力し **[次へ]** を押下して進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a495fcc5-8fde-5a9f-2165-c9c31b19fd79.png)

**[スクリプト名]** フィールドにも任意の名前、今回は`BASE64TOJPEG`と入力し **[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bd523d52-8344-a1d0-ee2d-78591699fbcf.png)

スクリプト内で使用するBase64データ用のスクリプト変数を新規作成します。
**[変数名]** フィールドは任意の名前、今回は`BASE64DATA`と入力
**[変数型]** `文字列型`を選択
**[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/03b2f4b7-80f0-fe51-980d-f97814918ac0.png)

デザイナ画面右側にあるツールパレットの **「ファイル」** カテゴリから **[ファイルシステム]－[ファイルシステム書き込み]** オペレーションを選択し、デザイナ中央部分にドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d1dce40f-723f-a4fa-1879-fad02f620528.png)


名前と必須設定の項目に下記の通り入力し、
| 項目名 | 設定値 | 説明 |
|:-|:-|:-|
|  名前 |JPEG生成| スクリプトキャンバス上での名前を入力します |
|ディレクトリ  |/data/TEST/jpeg| JPEGファイルを生成するDataSpiderファイルシステムのディレクトリパスを入力します。  |

**[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ec986f69-4166-5b3e-875e-bf746213329a.png)

:::note info
ローカルファイルシステムのマウント元は下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d38b707d-cc7e-d480-79cb-ad53e43da278.png)
:::

デザイナ画面右側にあるツールパレットの **「変換」** カテゴリから **[基本]－[マッピング]** アイコンを選択し、先に置いた　**[JPEG生成]**　アイコンの**左**へドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ec9c4935-f3a9-fad6-62cb-18a416dab4ca.png)

**[mapping]** から **[JPEG生成]** ドラッグ&ドロップして線を引きます。
**[プロセスフローとデータフローを引く]にチェックを入れ **[OK]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bd3ad003-dfa6-c22f-f5e1-6566259f36ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/36d07c5d-cf50-4cc4-cd9a-57c9f9f00c2e.png)


**[mapping]** をダブルクリックしてマッピング画面を表示し、入力元**スクリプト変数[BASE64DATA]** から 出力先　**[（data⁼）column]** へドラッグ&ドロップして線を引きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7c41dbbc-3a6b-31d1-910c-d2fb3bcfc982.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4b23f177-0b2f-a1c3-7ae4-5380fceaf31b.png)

デザイナ画面右側にあるツールパレットの **「文字列」** カテゴリから **[基本]－[単一行文字列定数]** アイコンを選択し、キャンバスへドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ca91fad1-b309-0e4c-1c96-16a844699b78.png)


必須設定とコメントの項目に下記の通り入力し、
| 項目名 | 設定値 | 説明 |
|:-|:-|:-|
|  一行文字列 |file| 固定値「file」を入力します |
|コメント  |file| 識別のために一行文字列と同値を入力します。  |

**[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5da1cecd-f7fb-5d3c-c878-6df5c4189b18.png)

デザイナ画面右側にあるツールパレットの **「文字列」** カテゴリから **[基本]－[単一行文字列定数]** アイコンを選択し、キャンバスへドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ca91fad1-b309-0e4c-1c96-16a844699b78.png)


必須設定とコメントの項目に下記の通り入力し、
| 項目名 | 設定値 | 説明 |
|:-|:-|:-|
|  一行文字列 |Testpen.jpg|任意のファイル名を入力します。 |
|コメント  |Testpen.jpg| 識別のために一行文字列と同値を入力します。  |

**[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2ca20723-fa69-285f-bb21-f93c97fe8189.png)

作成した **「file」** と **「Testpen.jpg」** アイコンから 出力先　**[（filetype）]** と **[（pass）]** へそれぞれドラッグ&ドロップして線を引きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6ef3c535-1dac-c539-a8c1-8b690a2aa007.png)

次にHTTPトリガーからBase64データを受けとるための**XML型のスクリプト入力変数**を作成します。

:::note warn
DataSpiderでHTTPトリガーからJSONデータを受け取るための変数型は**XML型**で設定する必要があります。
:::

**[変数名]** フィールドは任意の名前、今回は`IN_base64`と入力
**[変数型]** `XML型`を選択
**[スクリプト入力変数として使用する][必須]** にチェック
**[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f6bfe653-1785-7d91-ed21-0450b339168f.png)

デザイナ画面右側にあるツールパレットの **「基本」** カテゴリから **[処理]－[変数代入]** アイコンを選択し、先に置いた`mapping`アイコンの**左**へドラッグ&ドロップして配置し、
**[Start]** から **[variable]** 、 **[mappping]** までドラッグ&ドロップして線を引きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6edd7cfe-3288-297b-04db-8d3c38eb5ea2.png)


**[variable]** をダブルクリックして変数代入画面を表示します。
**[入力元]**配下に表示されている入力変数`IN_base64`へスキーマを設定します。
① **[root]**  配下に**属性[type]** を追加
② **[root]**  配下に**子要素** を追加。HTTPトリガーで受け取るBase64データのパラメータ名、今回は`photoimage`という名前で連携されてくると仮定して同値を入力
③追加した子要素配下に**属性[type]** を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/836ef172-26b5-9a05-883c-7f1bfb881fe8.png)

入力元の子要素`photoimage`と出力先のスクリプト変数`base64data`をドラッグ&ドロップして線を引きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/944af9c8-0664-e3a4-ad70-574907bcf61b.png)

**[JPEG生成]**  から **[End]** までドラッグ&ドロップして線を引きます。これでスクリプトの完成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2a4a797b-9da7-5378-fdc8-b3dde2e4be17.png)


### 2.プロジェクトのサービス登録
作成したスクリプトをHTTPトリガーから起動させるためには、プロジェクトのサービス登録が必要です。
**[メニュー]** **[ファイル]**  から　**[プロジェクトをサービスして登録]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/023100d9-ec70-ef68-114e-0d0d229a4585.png)
**[次へ]**  を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e8714f8a-8896-33e2-bddc-682114eeddfd.png)

**[完了]**  をクリックしてプロジェクトが登録されたことを確認します。

:::note info
登録済みサービスを上書きする場合は、内容を確認して問題なければ完了させます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2ca8ce6f-2100-e522-125a-ae0518b4eb74.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0b22073a-b8ed-2b0e-151e-1bf79743ab93.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/af637355-99a0-3fb9-234c-219d00d83f71.png)

### 3.HTTPトリガーの作成
最後にHTTPトリガーを作成していきます。**[DataSpiderStudio]**　のメニューから **[マイトリガー]**　を起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ad225487-aaf7-0b80-5c17-dcb292f5175c.png)

**[新しいHTTPトリガーを作成する]**　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/204ff57c-9868-f8ec-cd2b-50656e312794.png)
**[トリガー名]** 任意の名前、今回は`testjpeg`と入力
**[実行パス]**  任意の名前、トリガー名と同名を入力
**[次へ]** を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/441afce2-5abf-1148-a470-1ee555bd409f.png)
**[サービス名]** 登録したサービス名が表示されていることを確認
**[スクリプト]**  作成したスクリプト名が表示されていることを確認
**[スクリプト引数]** の **[値]** にHTTPトリガー変数として **入力データ**を設定します。
**[完了]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/15ecf047-4d78-59fd-d6ec-9697976c26b3.png)

**[はい]** を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e575e459-324b-8687-c5c6-9097240c3add.png)

**[マイトリガー]** 画面でトリガー名で`testjpeg`のHTTPトリガーが登録されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/24a242ac-a44b-074e-7f0c-97e4706183ae.png)


## 検証用データ準備
### 1.画像のBase64データ準備
:::note info
本来であれば顔や手の生体認証系に必要なデータが望ましいですが、今回はテストデータとして「赤ペン」の画像を用意しました。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/71d9f3ca-d8a3-5d19-9f19-72bda10d8320.png)

Base64のエンコードツールを用いて画像ファイルをBase64のデータへ変換します。

:::note info
エンコードツールの例は下記です、
　[Base64エンコード/デコードツール](https://www.rapidtables.org/ja/web/tools/base64-encode.html)
:::

### 2.JSONデータ準備

HTTPトリガー実行時で読込むJSONファイルを用意します。
今回は`testjpeg.Json`を用意しました。
パラメータ`photoimage`にBase64エンコードした値を設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4983260d-0863-c281-fd45-c2beb079a00a.png)
## HTTPトリガーの実行
:::note info
今回はWindowsPowerdhellで HTTP の実行要求を送信する　**[Invoke-RestMethod]**　を使用して作成したHTTPトリガーを実行します。
　[Invoke-RestMethodリファレンス](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7.4)
:::

``` トリガー実行用コマンド.txt
$uri = 'http://127.0.0.1:7700/dataspider/trigger/testjpeg'
$bodypath = 'C:\work\test\testjpeg.json'
$body = Get-Content $bodyPath -RAW -Encoding UTF8
Invoke-RestMethod -Method Post -Uri $uri -Body $body -ContentType 'application/json'
```

## 実行結果確認

ローカルシステムのマウント元フォルダに対象のJPEGファイルが生成されていることが確認できます。

:::note info
ローカルファイルシステムのマウント元は下記になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d38b707d-cc7e-d480-79cb-ad53e43da278.png)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f75ff2a6-3116-a7e6-af20-721d82486b98.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6ac42022-0a57-49d4-a6f1-15054da4c59b.png)

:::note info
 **[マイログ]**　からもトリガーより起動されたスクリプトが **正常終了** したことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ea585016-4d96-f33e-c792-d3488f019c37.png)
:::

# おわりに
いかがだったでしょうか。
当ブログではDataSpiderで画像ファイルを受信、変換する方法について一例を紹介してきました。
AWSの画像認識サービスであるAmazon Rekognitionとの連携や連携先サービスの仕様により画像ファイルの暗号化が必要な場合には下記ブログもご参照いただければと思います。
　[DataSpiderでPythonのスクリプトを実行してみた](https://qiita.com/sugimon/items/87ab095a501cbdab1b61)


ここまで読んでいただきありがとうございました。それでは、また！