マルチパート形式 (フォームデータ)

MIME タイプ: multipart/form-data

ID: multipart

DataWeave ではマルチパートサブタイプ (特に ​form-data​) がサポートされます。この形式では、各パートの形式に関係なく、1 つのペイロード内で複数の異なるデータパートを処理できます。パートの開始と終了を区別するには、境界を使用します。各パートのメタデータはヘッダーを介して追加できます。

DataWeave では、特定の ​Object​ 構造を使用して、マルチパートドキュメントを表します。

type Multipart = {
  preamble?: String,
  parts: {
    _?: MultipartPart
  }
}
type MultipartPart = {
  headers?: {
    "Content-Disposition"?: {
      name: String,
      filename?: String
    },
    "Content-Type"?: String
  },
  content: Any
}

次の例は、マルチパート形式の使用方法を示しています。

例: マルチパート

次の例は、DataWeave で単純なマルチパートコンテンツを読み取る方法を示しています。

入力

マルチパート入力は、DataWeave ソースへのペイロードとして機能します。

--34b21
Content-Disposition: form-data; name="text"
Content-Type: text/plain

Book
--34b21
Content-Disposition: form-data; name="file1"; filename="a.json"
Content-Type: application/json

{
"title": "Java 8 in Action",
"author": "Mario Fusco",
"year": 2014
}
--34b21
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<title> Available for download! </title>
--34b21--

ソース

この DataWeave スクリプトは、マルチパート入力ペイロードを DataWeave (dw) 形式に変換します。

%dw 2.0
output application/dw
---
payload

出力

この出力は、DataWeave (dw) 形式でマルチパート入力がどのように表されるのかを示しています。​raw​ および ​content​ 値は、簡潔にするために短縮されています。完全な値はこれよりも長くなります。

{
    parts: {
        text: {
            headers: {
                "Content-Disposition": {
                    name: "text",
                    subtype: "form-data"
                },
                "Content-Type": "text/plain"
            },
        content: "Book" as String {
            raw: "Qm9vaw==" as Binary {
                    base: "64"
                },
                encoding: null,
                mediaType: "text/plain",
                mimeType: "text/plain"
            }
        },
        file1: {
            headers: {
                "Content-Disposition": {
                    name: "file1",
                    filename: "a.json",
                    subtype: "form-data"
                },
                "Content-Type": "application/json"
            },
            content: {
                title: "Java 8 in Action",
                author: "Mario Fusco",
                year: 2014
            } as Object {
                raw: "ewogICJ0aXRsZSI6ICJKYXZhI...==" as Binary {
                    base: "64"
                },
                encoding: null,
                mediaType: "application/json",
                mimeType: "application/json"
            }
        },
        file2: {
            headers: {
                "Content-Disposition": {
                    name: "file2",
                    filename: "a.html",
                    subtype: "form-data"
                },
                "Content-Type": "text/html"
            },
            content: "PCFET0NUWVBFIGh0bWw+Cjx0aXRsZT4KI...==" as Binary {
                base: "64"
            }
       }
    }
}

例: パートのデータにアクセスして変換する

DataWeave スクリプト内で、​parts​ 要素を選択し、任意のパートのデータにアクセスし、変換できます。操作は配列に基づくことができます。また、パートを参照するための名前がパートに設定されている場合は、キーに基づくことができます。パートのデータには ​content​ キーワードを介してアクセスでき、ヘッダーには ​headers​ キーワードを介してアクセスできます。

入力

次の例は、個別の DataWeave スクリプトへの入力として機能します。 3 つのパートで構成される ​34b21​ 境界を含む未加工の ​multipart/form-data​ ペイロードを以下に示します。

  • text​ という名前の ​text/plain

  • file1​ という名前の ​application/json​ ファイル (​a.json​)

  • file2​ という名前の ​text/html​ ファイル (​a.html​)

未加工のマルチパートデータ:
--34b21
Content-Disposition: form-data; name="text"
Content-Type: text/plain

Book
--34b21
Content-Disposition: form-data; name="file1"; filename="a.json"
Content-Type: application/json

{
  "title": "Java 8 in Action",
  "author": "Mario Fusco",
  "year": 2014
}
--34b21
Content-Disposition: form-data; name="file2"; filename="a.html"
Content-Type: text/html

<!DOCTYPE html>
<title>
  Available for download!
</title>
--34b21--

ソース

次の DataWeave スクリプトは、入力として未加工の ​multipart/form-data​ ペイロードを使用し、​Book:a.json​ を生成します。

マルチパートコンテンツの読み取り:
%dw 2.0
output text/plain
---
payload.parts.text.content ++ ':' ++ payload.parts[1].headers.'Content-Disposition'.filename

例: マルチパートコンテンツを生成する

DataWeave がパートのリスト (各パートにヘッダーとコンテンツが含まれる) を含むオブジェクトを構築するマルチパートコンテンツを生成できます。次の DataWeave スクリプトでは、ペイロード内で HTML データを使用できる場合に、(以前に分析した) 未加工のマルチパートデータを生成します。

マルチパートコンテンツの書き込み:
%dw 2.0
output multipart/form-data
boundary='34b21'
---
{
  parts : {
    text : {
      headers : {
        "Content-Type": "text/plain"
      },
      content : "Book"
    },
    file1 : {
      headers : {
        "Content-Disposition" : {
            "name": "file1",
            "filename": "a.json"
        },
        "Content-Type" : "application/json"
      },
      content : {
        title: "Java 8 in Action",
        author: "Mario Fusco",
        year: 2014
      }
    },
    file2 : {
      headers : {
        "Content-Disposition" : {
            "filename": "a.html"
        },
        "Content-Type" : payload.^mimeType
      },
      content : payload
    }
  }
}

パートの名前が ​Content-Disposition​ ヘッダーに明示的に提供されていない場合は、キーによりパートの名前が決まります。また、DataWeave は、サポートされる形式からのコンテンツを処理できるだけでなく、HTML など、サポートされない形式への参照からコンテンツを処理できます。

Configuration のプロパティ

DataWeave では、マルチパート形式の次の設定プロパティがサポートされています。

Reader のプロパティ

マルチパート形式では、入力データの読み込みの指示を提供するプロパティを使用できます。

パラメーター デフォルト 説明

boundary

String

null

マルチパートの ​boundary​ 値。パートを区切る文字列。

defaultContentType

String

このプロパティにデフォルト値はありません。

multipart/*​ 形式のパートで使用するデフォルトのコンテンツタイプを設定します。設定すると、このプロパティは ​com.mulesoft.dw.multipart.defaultContentType​ の システムプロパティ設定​よりも優先されます。​2021 年 8 月リリースの Mule 4.3.0-20210719 の DataWeave 2.3 (2.3.0-20210720) で導入されました。

Writer のプロパティ

マルチパート形式では、出力データの書き込みの指示を提供するプロパティを使用できます。

パラメーター デフォルト 説明

boundary

String

null

マルチパートの境界値。パートを区切る文字列。

bufferSize

Number

8192

バッファライターのサイズ。

deferred

Boolean

false

true​ に設定すると、DataWeave は出力をデータストリームとして生成し、スクリプトの実行はそれがコンシュームされるまで延期されます。 有効な値は、​true​ または ​false​ です。

サポートされる MIME タイプ (マルチパート)

マルチパート形式では、次の MIME タイプがサポートされています。

MIME タイプ

multipart/*