高度なカスタマイズ > Info*Engine ユーザーガイド > Info*Engine データ管理 > BLOB のアップロードおよびダウンロード > BLOB のアップロード時のフォーム変数の使用方法
  
BLOB のアップロード時のフォーム変数の使用方法
BLOB をアップロードするには、ご使用の JSP ページの HTML フォーム要素に以下の属性を含める必要があります。
method="POST"
action="task_to_execute"
enctype="multipart/form-data"
これらの属性によって、BLOB のストリームやフォーム変数の保存に必要な環境が設定されます。
フォーム変数の使用方法や BLOB 処理の制御方法を理解するには、Web ブラウザ、Info*Engine、アダプタ、およびデータベースによる、ブラウザからデータベースへの BLOB データの転送時の相互作用を知ることが役に立ちます。以下の相互作用によって、フォームがブラウザからサブミットされたときに生じる主な手順を識別します。
ブラウザによって、データのストリームとしてフォーム変数およびファイルデータが Web サーバーから Info*Engine サーブレットを経由して送信されます。
最適なパフォーマンスを維持するために、Info*Engine サーブレットおよび Info*Engine サーバーは、何の処理もしないうちにストリーム全体を読み取って保存するといったことはせずに、ストリームをただ受信します。
サーブレットは、入力ストリームの開始時に保存されたフォーム変数を読み取り、このフォーム変数は最初の BLOB データに達するまで @FORM コンテキストグループに保存されます。
BLOB に達すると、Info*Engine サーブレットは変数の保存を止め、BLOB データをその出力ストリームに渡します。このため、ストリームは Info*Engine サーバーまで継続します。
HTML form action 属性で識別されるタスクを実行することによって、Info*Engine サーバーはアダプタに接続し、BLOB をアダプタに渡します。
タスクの Webject を実行することによって、アダプタがデータベースに接続し、BLOB をデータベースに送信します。
以下のコードの例は、ファイルを選択してデータベース行の列に保存するための説明文とフォームを示します。この例は、Info*Engine サーブレットを使用して Info*Engine タスクにデータを直接送信します。つまり、クライアントは、「サブミット」をクリックすると、タスクの実行により生成された XML 出力を受信します。
<%@page language="java" session="false" errorPage="../IEError.jsp"%>
<%@ taglib uri="http://www.ptc.com/infoengine/taglib/core" prefix="ie" %>
<html>
<head>
<title>Upload File</title>
</head>
<body>
This page prompts for a "name" and "file" to store in an database.
The "name" is used to select a row in the table. The value of
"name" and the "file" contents are stored in columns in the selected row.
The table must be created before this example is run. The table could be created
using a SQL statement like 'CREATE TABLE BLOBTEST (NAME VARCHAR(60),FILECONTENT BLOB)'
<h2>Upload File to Oracle BLOB Column</h2>
<form method="POST" action="/Windchill/servlet/IE/tasks/com/company/UploadBlob.xml"
      enctype="multipart/form-data">
<TABLE>
  <tr> <td align=right>
      <B><FONT FACE=arial,helvetica>Adapter Instance:
    </td>
    <td>
      <INPUT name = "instance" type="text" size=50>
    </td>
  </tr>
  <tr> <td align=right>
      <B><FONT FACE=arial,helvetica>Name:
    </td>
    <td>
      <INPUT name = "filename" type="text" size=50>
    </td>
  </tr>
  <tr> <td align=right>
      <B><FONT FACE=arial,helvetica>File:
    </td>
    <td>
      <INPUT name = "file" type="file" size=50>
    </td>
  </tr>
  <tr> <td align=right>
      <INPUT type=submit NAME="submit" VALUE="Submit" id=button>
    </td>
  </tr>
</TABLE>
</form></body></html>
第 3 の形式の INPUT 要素によって表示される file select 制御によって、ユーザーがアップロードするファイルを選択する手段が提供されます。データストリームが生成されると、選択されたファイルの BLOB データは、2 つの第 1 の INPUT 要素からフォーム変数が設定された直後にストリームされます。
form 要素の action 属性で識別される UploadBlob.xml タスクは、Info*Engine サーバーによって実行されるタスクです。このタスク (次のセクションで説明します) はフォーム変数を使用して、アダプタインスタンスを識別し、BLOB が保存されるテーブル行内の BLOB に対応する名前を指定します。
タスクで使用するフォーム変数が Info*Engine によって保存されていることを確認するには、BLOB ファイルを選択する INPUT 要素の前にある INPUT 要素にフォーム変数を設定する必要があります (前述の例と同様)。INPUT 要素の順番が前述の例と逆になっていると、タスクに必要なフォーム変数が BLOB データ後までストリームに現れないため、それらのフォーム変数が @FORM コンテキストグループに保存されません。ストリーム全体がアダプタに転送されないとサーバーで読み取ることができないので、BLOB 後のストリームのフォーム変数はすべて失われてしまいます。代わりに、サーバーは、最初に全体をメモリにバッファしないで、BLOB を直接アダプタに転送します。これによって、パフォーマンスが最適化され、大容量のファイルも膨大なシステムメモリを使用することなくアダプタに送信できます。