FW ファイルアップロード ダウンロード機能利用ガイド Version 1.1 2016 年 9 月 21 日富士通株式会社 i
改訂履歴改訂 No. 日付 Version 章 No. 項 No. 改訂内容 1 2015/12/02 1.0 - - 新規作成 2 2016/09/21 1.1 4 4.1.3 text/plan を text/plain に修正 章立てを修正 ii
目次 第 1 章 はじめに... 1 第 2 章 ファイルアップロード機能... 2 第 3 章 ファイルダウンロード機能... 3 第 4 章 作業詳細... 4 4.1 リクエストの送信... 4 メソッド... 4 ヘッダ... 4 multipart の内部構造... 4 4.2 レスポンスの受信... 6 ヘッダ... 6 ボディ部... 6 4.3 フレームワーク定義の設定... 7 定義ファイル... 7 4.4 SIMPLEEVENTFLOW 定義の編集... 8 4.5 業務処理の実装... 9 実行対象のメソッドの引数設定... 9 業務処理の実装... 13 4.5.2.1 アップロードファイルの情報を取得し業務処理を実装する例... 13 4.5.2.2 ダウンロードファイル情報を返却するための処理を実装する例... 14 iii
第 1 章 はじめに 本資料は ファイルのアップロード ダウンロード機能の利用方法について説明します 1
第 2 章 ファイルアップロード機能 ファイルアップロード機能は http リクエストにファイルデータを設定し 対応する業務処理に連携することでファイルのアップロードを実現するための機能です ファイルアップロード処理時に対象のファイルに問題がないか以下のチェックを行います チェックで問題となった場合は http レスポンスにエラーコードを返却し処理を中断します チェック項目 デフォルト値 備考 ファイルのアップロード数の上限チェック 100 個 フレームワーク定義で任意設定可能です アップロードファイルの単体ファイルサイズチェック 1000000000 バイト フレームワーク定義で任意設定可能です アップロードファイルの1リクエストに対する全体サイズチェック 1000000000 バイト フレームワーク定義で任意設定可能です クライアント フレームワーク プラグイン 業務処理でファイルアップロード機能として必要な作業は以下の通りです 作業を行う箇所 必要となる作業 説明 備考 クライアント リクエストの送信 http リクエストでファイルデータを含むデータを送信します 送信するデータ形式は FW の指定したインターフェースで設定してください フレームワーク フレームワーク定義の設定 フレームワークの共通設定を定義している定義ファイル (xframeworkconfig.xml) に ファ イルアップロード ダウンロード処理に関連する値を設定します プラグイン SimpleEventFlow 定義の編集 FW プラグインの SimpleEventFlow デザイナー にて SimpleEventFlow 定義の編集を行います モデルベースオブジェクト (MBC) のパラメーターリストに BPM_CONTEXT を定義します 業務処理 業務処理の実装 モデルオブジェクトクラス (MBC) にて IBPMContext よりアップロードファイルに関連す る値を取得する処理を実装します 取得した IBPMContext よりアップロードファイル情 報を取得し アップロード処理を実装します フレームワークの定義ファイルについては別紙 FW 全体定義体ガイド を参照してください SimpleEventFlow 定義 SimpleEventFlow デザイナーと関連する用語については 別紙 SimpleEventFlow 定義ツールマニュアル を参照してください ファイルアップロード機能に関連する機能配置の概要は以下の通りです クライアント フレームワーク BPM IBPMContext モデルオブジェクト (MBC) 業務処理 HTTP リクエストにファイルのデータを設定し送信します multipart 形式により複数ファイルを送信できます フレームワーク定義 (xframeworkconfig.xml) プラグイン (BPM 資産の自動生成 ) SimpleEventFlow 定義 2
第 3 章 ファイルダウンロード機能 ファイルダウンロード機能は http レスポンスに業務処理で書き込んだファイルの情報を返却することでファイルのダウンロードを実現するための機能です リクエストについてはフレームワークで許可している GET,POST,PUT,DELETE のメソッドが使用可能です クライアント フレームワーク プラグイン 業務処理でファイルダウンロード機能として必要な作業は以下の通りです 作業を行う箇所 必要となる作業 説明 備考 クライアント レスポンスの受信 http レスポンスで FW が設定したファイルデータを受信します フレームワーク フレームワーク定義の設定 フレームワークの共通設定を定義している定義ファイルに ファイルアップロード ダウ ンロード処理に関連する値を設定します プラグイン SimpleEventFlow 定義の編集 FW プラグインの SimpleEventFlow デザイナー にて SimpleEventFlow 定義の編集を行います モデルベースオブジェクト (MBC) のパラメーターリストに BPM_CONTEXT を定義します 業務処理 業務処理の実装 モデルベースオブジェクトクラス (MBC) にて IBPMContext より値を取得する処理を実 装します 取得した IBPMContext よりアップロードファイル情報を取得し アップロード処理を実装します フレームワークの定義ファイルについては別紙 FW 全体定義体ガイド を参照してください SimpleEventFlow 定義 SimpleEventFlow デザイナーと関連する用語については 別紙 SimpleEventFlow 定義ツールマニュアル を参照してください ファイルダウンロード機能に関連する機能配置の概要は以下の通りです クライアント フレームワーク ファイルのデータが設定されている http レスポンスを受信します ファイルは 1 レスポンスにつき 1 ファイルのみ設定されています BPM IBPMContext モデルオブジェクト (MBC) 業務処理 フレームワーク定義 (xframeworkconfig.xml) プラグイン (BPM 資産の自動生成 ) SimpleEventFlow 定義 3
第 4 章作業詳細 各作業の詳細を以下に示します 4.1 リクエストの送信 ファイルアップロードを行う際の http リクエストのインターフェースを以下に示します メソッド POST と PUT が使用可能です ヘッダファイルアップロードに関連する http リクエストヘッダの形式は以下の通りです フィールド設定 説明 設定必須 / 任意 Content-Type: multipart/form-data; boundary=[ バウンダリ文字列 ] ファイルアップロード処理ではマルチパートの形式で受信することを想定しているため 必須 Content-Type には "multipart/form-data" を設定してください 備考 multipart の内部構造内部構造は http の multipart 形式の記述に準拠してください multipart 形式の http リクエストについて ボディ部の設定は下記の通りに設定します 1 バウンダリ区切り 1 件目のデータのヘッダとボディ部構造バウンダリ区切り 1 件目に IF データ定義にて定義した Json 形式のデータを設定します ヘッダの形式は以下の通りです フィールド設定 説明 設定必須 / 任意 Content-Type: application/json バウンダリの1 区切り目は IF データ定義の形式で受信することを想定しているため 必須 "application/json" を設定してください 備考 ボディ部は IF データ定義の形式の Json データを設定します IF データ定義に対応する値を特に設定しない場合は {} ( 空設定 json の囲みのみ設定 ) をしてください ( しない場合はフレームワークエラーが発生します ) 2 バウンダリ区切り 2 件目以降のヘッダとボディ部構造バウンダリ区切り 2 件目以降にアップロードしたいファイルの情報を設定します 関連するヘッダの形式は以下の通りです フィールド設定 説明 設定必須 / 任意 Content-Type:[ 任意の設定 ] アップロードファイルに対応する Content-Type と charset を設定してください 任意 ただし 値の使用は業務処理に依存します Content-Disposition: Content-Disposition ヘッダの filename 引数に 任意 filename=[ ファイル名 ] アップロードファイルに対応するファイル名を設定してください ただし 値の使用は業務処理に依存します 備考 ファイル名に日本語等 マルチバイト文字を使用する場合は URLEncode を実施する必要があります ボディ部はファイルデータを設定します ボディ部の末尾にバウンダリの終了区切り (-- を末尾に設定 ) を設定してください 4
multipart の内部構造の例は以下の通りです IF データ定義の値有 http リクエストヘッダに Content-Type: multipart/form-data; boundary=fw_rest_server_handle_xf423f 1511E8D8EF800-10.77.11.154 が設定されている場合の内部構造です --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154 Content-type: application/json { "string_hankaku" : "test", "string_zenkaku" : " テスト ", "lastupdate" : "20150501", "number_long" : 1, "number_decimal" : 1.1, "catalog_string" : "01", "catalog_nmber" : 0 } --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154 Content-type: text/plain Content-Disposition: attachment; filename=uploadfile.txt IF データ定義に対応した Json 形式の値を設定します バウンダリ区切り 2 区切り目以降はファイルの情報を設定します ファイルデータ箇所ファイルアップロードのデータ ( テキストベース ) --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154 Content-type: text/plain Content-Disposition: attachment; filename=%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e7%94%a8%e8%a9%a6%e9%a8%93%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab.txt ファイル名に日本語等マルチバイト文字を使用する場合は URLEncode を実施する必要があります ファイルアップロードのデータ ( テキストベース ) --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154-- バウンダリの終了区切り IF データ定義の値無 http リクエストヘッダに Content-Type: multipart/form-data; boundary=fw_rest_server_handle_xf423f 1511E8D8EF800-10.77.11.154 が設定されている場合の内部構造です IF データ定義の値が無い場合であっても バウンダリ区切り 1 件目は json を設定してください ボディ部には {}( 空設定 ) を行ってください --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154 Content-type: application/json {} --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154 Content-type: text/plain Content-Disposition: attachment; filename=uploadfile.txt {} ( 空設定 ) をしてください ファイルアップロードのデータ ( テキストベース ) --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154 Content-type: text/plain Content-Disposition: attachment; filename=%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e7%94%a8%e8%a9%a6%e9%a8%93%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab.txt ファイルアップロードのデータ ( テキストベース ) --FW_REST_SERVER_HANDLE_XF423F 1511E8D8EF800-10.77.11.154-- 5
4.2 レスポンスの受信 ファイルダウンロードを行う際の http レスポンスのインターフェースを以下に示します ヘッダ ファイルダウンロードに関連する http レスポンスヘッダは以下の通りです フィールド設定 説明 備考 Content-Disposition: attachment; filename=[ ファイル名 ] ダウンロードファイルのファイル名が設定されます 業務処理でファイル名が設定されない場合は 当フィールドは設定されません 値の設定有無 設定値については連携した業務処理に依存します 1Content-Type: [ コンテンツ種別 ] もしくは 2Content-Type: [ コンテンツ種別 ] ;charset=[ エンコード ] ダウンロードファイルのコンテンツ種別とエンコードが設定されます 業務処理でコンテンツ種別やエンコードが設定されない場合は 当フィールドは設定されません 値の設定有無 設定値については連携した業務処理に依存します コンテンツ種別のみ業務処理で設定した場合は1 コンテンツ種別とエンコードを業務処理で設定した場合は2が設定されます ボディ部 ボディ部に設定されているストリームがファイルのデータとなります 6
4.3 フレームワーク定義の設定 フレームワークで使用している定義ファイルにアップロード処理に関連する値を設定します 設定内容を以下に示します 定義ファイル ファイル名 :xframeworkconfig.xml 概要 : フレームワークを構成するモジュールが共通で使用する定義体 関連する領域の設定は以下の通りです 値の詳細については別紙 FW 全体定義体ガイド を参照してください 領域名 FILE_UTIL X71_SV_REQUEST_CHECKER X71_SV_REQUEST_CHECKER 定義名 temporary.file.path com.fujitsu.xframework.x71.server.check.httprequestsizechecker com.fujitsu.xframework.x71.server.check.httprequestcountchecker 7
4.4 SimpleEventFlow 定義の編集 SimpleEventFlow 定義の モデルベースオブジェクト (MBC) のプロパティ パラメーターリスト の格納 RP キーに BPM_CONTEXT を設定します 格納 RP キーに BPM_CONTEXT を設定します 呼び出し対象のメソッドの引数の順番と合わせる必要があります 8
4.5 業務処理の実装 ファイルアップロード ダウンロード処理で必要となる業務実装を以下に示します 実行対象のメソッドの引数設定ファイルアップロード ダウンロードの処理を行うクラスのインターフェース (IBPMContext) を実行対象メソッドのパラメータに追加します IBPMContext のインターフェースは下記の通りです クラス名機能概要 com.fujitsu.fw.parameter.context.ibpmcontext HTTP 連携で設定される情報について格納 編集 取得する機能提供します 当資料ではファイルアップロード ダウンロードに関する説明を記述します メソッド名 パラメータ 返却値 例外 説明 getuploadfilessize 無 int 無 処理概要アップロードファイル数を取得します 返却値設定されたアップロードファイル数 getuploadfilecontents int index IUploadFileContents 無 処理概要アップロードファイル情報 1を取得します アップロードされた順序に対応した index を設定し取得できます 設定されていない index を指定した場合は null を返却します パラメータ index - ファイル設定位置 ( 位置は boundary で区切られたダウンロードファイルの順に 0 から始まります ) 返却値アップロードファイル情報 createdownloadfilecontents 無 IDownloadFileContents 無 処理概要ダウンロードファイル情報 2を作成します 返却値ダウンロードファイル情報 removedownloadfile 無 無 com.fujitsu.fw.exception.frameworkexception 処理概要 ダウンロードファイル情報を削除します 9
1: アップロードファイル情報 : アップロードファイルに関連する情報の取得機能を提供するクラス インターフェースは以下の通りです クラス名機能概要 com.fujitsu.fw.url.file.iuploadfilecontents アップロードファイルの情報を操作する機能を提供します メソッド名 パラメータ 返却値 例外 説明 getuploadfilename 無 String 無 処理概要アップロードファイル名を取得します 返却値アップロードファイル名 未設定の場合は null を返却します getuploadfilecontenttype 無 String 無 処理概要アップロードファイルのコンテンツ種別を取得します 返却値コンテンツ種別 未設定の場合は null を返却します getuploadfilestream 無 java.io.inputstream com.fujitsu.fw.exception.frameworkexception 処理概要アップロードファイルのストリームを取得します 返却値アップロードファイルのストリーム getuploadfileheaders 無 Map<java.lang.String,java.lang.String[]> 無 処理概要アップロードファイルのヘッダ情報を取得します 返却値 アップロードフィルのヘッダ情報 10
2: ダウンロードファイル情報 : ダウンロードファイルに関連する情報の作成 取得 削除機能を提供するクラス インターフェースは以下の通りです 設定する値 ( ストリーム ファイル名 コンテンツ種別 エンコード ) は任意設定です 設定していない場合は対応する箇所に値が設定されません ストリームが設定されていない場合は http レスポンスのボディが空となります ダウンロードファイル情報を作成した場合 http レスポンスはファイル情報を返却します ダウンロードファイルを作成していない場合 もしくは作成後 IBPMContext.removeDownloadFile を実行した場合は ファイル情報を返却せず IF データ定義に対応する値を http レスポンスとして返却します クラス名機能概要 com.fujitsu.fw.url.file.idownloadfilecontents ダウンロードファイルの情報を操作する機能を提供します メソッド名 パラメータ 返却値 例外 説明 getoutputstream 無 java.io.outputstream com.fujitsu.fw.exception.frameworkexception 処理概要ダウンロードファイル用のストリームを取得します ダウンロードさせたい内容を取得したストリームに書き込みます 書き込んだ情報がダウンロードファイルの中身となります 返却値ダウンロードファイル用ストリーム setfilename String filename 無 無 処理概要ダウンロードファイルの名前を設定します 設定した場合 レスポンスのヘッダに以下の内容が追加されます Content-Disposition: attachment; filename=[ 設定した値 ] ファイル名はサーバのデフォルトエンコードで URLEncode されます パラメータ filename ダウンロードファイル名 getfilename 無 String 無 処理概要ダウンロードファイル名を取得します 返却値ダウンロードファイル名 setcontenttype String contenttype 無 無 処理概要ダウンロードファイルのコンテンツ種別を設定します 設定した場合 レスポンスのヘッダに以下の内容が追加されます Content-Type: [ 設定した値 ] パラメータ contenttype コンテンツ種別 getcontenttype 無 String 無 処理概要ダウンロードファイルのコンテンツ種別を取得します 返却値コンテンツ種別 setencode String encode 無 無 処理概要ダウンロードファイルのエンコードを設定します 設定した場合 レスポンスヘッダが以下の内容が追加されます Content-Type: [ 設定したコンテンツ種別 ;charset=[ 設定した値 ] ただし setcontenttype でコンテンツ種別を設定しない場合は エンコードは設定されません パラメータ encode エンコード getencode 無 String 無 処理概要ダウンロードファイルのエンコードを取得します 返却値エンコード remove 無 無 com.fujitsu.fw.exception.frameworkexception 処理概要 ダウンロードファイル情報の削除処理を行います 11
12
業務処理の実装 http リクエストで設定されたアップロードファイルの情報を取得し 業務がファイルアップロード業務に関連する処理を実装します また http レスポンスにダウンロードファイルの情報を返却するために 業務がダウンロードファイル情報を返却するための処理を実装します 実装例は以下の通りです 4.5.2.1 アップロードファイルの情報を取得し業務処理を実装する例 public IFDataTypeTextOutput fileuploaddownload(isessionhandle handle, IFDataTypeTextInput ifdatatypetextinput, IBPMContext context) { ILogger logger = this.getlogger(); // 設定されているアップロードファイルの数分処理を行う for (int i = 0; i < context.getuploadfilessize(); i++) { // アップロードファイル情報を取得する IUploadFileContents uploadfile = context.getuploadfilecontents(i); // 設定されているファイル名を取得する String filename = uploadfile.getuploadfilename(); // アップロードファイルの中身をストリームで取得する try (InputStream is = uploadfile.getuploadfilestream()) { IBPMContext をパラメータに設定します パラメータの位置は ISessionHandle を除き SimpleEventFlow 定義の編集で設定したパラメータの順となります 設定されているアップロードファイルの数分ループしながら各種情報を取得し アップロード処理を実装します ~ ストリームを取得し 業務で必要なアップロード処理を実装する ~ } } catch (Exception e) { logger.log(basiclevel.debug, " アップロードファイル処理に失敗しました ", e); throw new ModelLogicException(e, " アップロードファイル処理に失敗しました ","ERROR_CODE_FILE"); } ~ 以降の処理 記述省略 ~ 13
4.5.2.2 ダウンロードファイル情報を返却するための処理を実装する例 public IFDataTypeTextOutput fileuploaddownload(isessionhandle handle, IFDataTypeTextInput ifdatatypetextinput, IBPMContext context) { ILogger logger = this.getlogger(); // ダウンロードファイル情報を作成 IDownloadFileContents downloadfile = context.createdownloadfilecontents(); OutputStream output = downloadfile.getoutputstream(); output.write(" ファイルダウンロードのサンプル ".getbytes()); // コンテンツ種別を設定 downloadfile.setcontenttype("text/plain"); // ファイル名を設定 ( ファイル名はサーバのデフォルトエンコードで URLEncode されます ) downloadfile.setfilename(" ダウンロード用試験ファイル.txt"); ~ 以降の処理 記述省略 ~ IBPMContext をパラメータに設定します パラメータの位置は ISessionHandle を除き SimpleEventFlow 定義の編集で設定したパラメータの順となります ダウンロードファイル情報を作成します ダウンロードファイル情報を作成した場合 http レスポンスはファイル情報を返却します } 取得したストリームにファイルの中身を書き込みます フレームワークがクローズ処理を行うため 業務処理では特にクローズする必要はありません 14