高度なカスタマイズ > Info*Engine ユーザーガイド > Info*Engine データ管理 > BLOB のアップロードおよびダウンロード
  
BLOB のアップロードおよびダウンロード
BLOB は、バイナリラージオブジェクト (Binary Large Object) の略称です。BLOB は、Word ドキュメント、画像、サウンドファイルなどのビット単位のランダムラージブロックです。
HTML 形式および特殊な Adapter Webject を使用して、Web ブラウザからデータベースに BLOB をアップロードしたり、データベースから Web ブラウザに BLOB をダウンロードしたりできます。次の各セクションでは、フォーム変数の使用方法について説明し、BLOB のアップロードおよびダウンロードの例を示します。
BLOB をアップロードおよびダウンロードする Adapter Webject の詳細については、適切なアダプタガイドを参照してください。
上級ユーザー向けに、Info*Engine には BLOB を操作できる setOutputStreamsetInputStreamsendContent などのメソッドが用意されており、Java 言語には、BLOB をメモリから読み込んだりメモリに書き込んだりする java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStream などのクラスが用意されています。
* 
以下の例では、SQL ステートメントを持つ JDBC Adapter Webject が使用されています。これらは単純な例であり、悪意のあるユーザーからデータベースのコンテンツを保護するためにユーザー指定の入力を事前処理するようなことはしません。タスク著作者は、悪意のあるユーザーの攻撃から保護するために、ユーザー入力を検証することを講じる必要があります。このような攻撃では、SQL 注入を使用して、または不良パラメータ値を指定することで、タスクの利用が試みられ、このような攻撃により、データの破損や保護されているデータへのアクセスが発生することがあります。
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 を直接アダプタに転送します。これによって、パフォーマンスが最適化され、大容量のファイルも膨大なシステムメモリを使用することなくアダプタに送信できます。
アップロード済み BLOB を取得する Webject の制御
BLOB が Web ページまたは Info*Engine ベースのアプリケーションから Info*Engine にアップロードされる場合、Info*Engine では、BLOB を使用する Adapter Webject や、各 Webject が使用する BLOB の数を決定できません。デフォルトでは、Info*Engine は利用可能な BLOB をすべて、最初の Adapter Webject (ACT または OBJ タイプの Webject) に送信します。最初の Adapter webject が BLOB を使用する Webject と異なる場合があります。この場合は、Info*Engine のデフォルトの動作が必ずしも適切ではありません。
BLOB の Webject による使用方法を制御するには、BLOB_COUNT パラメータを Adapter Webject に含めます。このパラメータで、Adapter Webject に送信する BLOB 数を指定します。BLOB を Webject に送信しない場合は、値として 0 を指定できます。BLOB_COUNT パラメータを省略すると、残りの BLOB がすべて Webject に送信されます。
以下の UploadBlob.xml の例のタスクには、3 つの Adapter Webbject が含まれます。最初の 2 つの Webject (Do-Sql) はデータベースに対する行の削除と追加を行い、BLOB を使用しません。これらの Webject では、BLOB_COUNT パラメータは 0 に設定されます。第 3 の Webject (Put-Blob-Stream) は BLOB を保存する Webject で、1 つの BLOB を受け入れるように定義されています。Webject のパラメータで使用する @FORM 変数の値は、前のセクションで説明したフォームと似たフォームで指定できます。
* 
BLOB 送信先の Webject を除くすべての Webject に対し、BLOB_COUNT パラメータを 0 に設定する必要があります。
このタスクの例では、データベースに以下のコラムがあると見なします。
BLOB の名前を含む NAME コラム
BLOB データを含む FILECONTENT コラム
タスクの例のコードを以下に示します。
<%@page language="java" session="false"%>
<%@ taglib uri="http://www.ptc.com/infoengine/taglib/core"
           prefix="ie" %>
<!--
  Upload a file from the browser and save in an oracle
  blob column.
--/>
<ie:webject name="Do-Sql" type="ACT">
  <ie:param name="INSTANCE" data="$(FORM[]instance[])"
                            default="jdbcAdapter"/>
  <ie:param name="SQL"
      data="DELETE FROM BLOBTEST WHERE NAME=
           '$(FORM[]filename[0])'"/>
  <ie:param name="CLASS" data="BLOBTEST"/>
  <ie:param name="GROUP_OUT" data="TEMP"/>
  <ie:param name="BLOB_COUNT" data="0"/>
</ie:webject>
<ie:webject name="Do-Sql" type="ACT">
  <ie:param name="INSTANCE" data="$(FORM[]instance[])"
                            default="jdbcAdapter"/>
  <ie:param name="SQL"
      data="INSERT INTO BLOBTEST VALUES
           ('$(FORM[]filename[0])', EMPTY_BLOB())"/>
  <ie:param name="CLASS" data="BLOBTEST"/>
  <ie:param name="GROUP_OUT" data="TEMP"/>
  <ie:param name="BLOB_COUNT" data="0"/>
</ie:webject>
<ie:webject name="Put-Blob-Stream" type="OBJ">
  <ie:param name="INSTANCE" data="$(FORM[]instance[])"
                            default="jdbcAdapter"/>
  <ie:param name="CLASS" data="BLOBTEST"/>
  <ie:param name="ATTRIBUTE" data="FILECONTENT"/>
  <ie:param name="WHERE"
            data="(NAME='$(FORM[]filename[0])')"/>
  <ie:param name="GROUP_OUT" data="TEMP"/>
</ie:webject>
BLOB のダウンロードのためのフォーム変数の使用方法
以下のコードの例は、説明テキストと、BLOB を含んでいるデータベーステーブルから行を選択するためのフォームを生成します。「読み込み」をクリックすると、データベーステーブルから対応する行を選択し、それに含まれている BLOB を返す Info*Engine タスクが呼び出されます。
<%@page language="java" session="false" errorPage="../IEError.jsp"%>
<%@ taglib uri="http://www.ptc.com/infoengine/taglib/core" prefix="ie" %>
<html>
<head><title>Send Blob</title>
</head>
<body>
<P>This page prompts for a "name" of the BLOB file to retrieve from an
database and a "MIME type" to associate with the BLOB file. The
"name" is used to select a row in the table where the BLOB is
stored. The table must be created and BLOBs uploaded to rows in
the table before this example is run. The table could be
created using a SQL statement like 'CREATE TABLE BLOBTEST
(NAME VARCHAR(60),FILECONTENT BLOB)'.
<H2>Download File from BLOB Column</H2>
<P>The MIME type determines which application is opened when the BLOB is
received.  The MIME type is not stored in the table. Enter one of the
following MIME types:
<blockquote>'text/plain'<br>
'application/msword'<br>
'application/msexcel'<br>
'application/vnd.ms-excel'<br>
'image/gif'</blockquote>
<P>Include the single quotes in your MIME Type entry.</p>
<form method="POST" action="/Windchill/servlet/IE/tasks/com/company/DownloadBlob.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>Mime Type:
    </td>
    <td>
      <INPUT name = "mimetype" type="text" size=50>
    </td>
  </tr>
  <tr> <td align=right>
      <INPUT type=submit NAME="submit" VALUE="Retrieve" id=button>
    </td>
  </tr></TABLE></form></body></html>
form 要素の action 属性で識別される DownloadBlob.xml タスクは、Info*Engine サーバーによって BLOB のダウンロード時に実行されるタスクです。このタスク (次のセクションで説明します) ではフォーム変数を使用して、アダプタインスタンスを識別し、BLOB が保存されるテーブル行内の BLOB に対応する名前を指定して、MIME タイプを設定します。
例: BLOB ダウンロードタスク
以下の DownloadBlob.xml のタスクの例では、1 つの Adapter Webject が使用されています。この Webject は、1 つの BLOB を Web ブラウザにダウンロードします。MIMETYPE パラメータで指定された MIME タイプはブラウザに戻され、BLOB を表示するときにブラウザで起動されるアプリケーションを決定します。Webject のパラメータで使用する @FORM 変数の値は、前のセクションで使用したフォームと似たフォームで指定できます。
このタスクの例では、データベースに以下のコラムがあると見なします。
BLOB の名前を含む NAME コラム
BLOB データを含む FILECONTENT コラム
<%@page language="java" session="false"%>
<%@ taglib uri="http://www.ptc.com/infoengine/taglib/core"
           prefix="ie" %>
<!--
    Possible MIME Types
      application/msword
      text/plain
      application/msexcel
      application/vnd.ms-excel
--/>
<ie:webject name="Send-Blob-Stream" type="OBJ">
  <ie:param name="INSTANCE" data="$(FORM[]instance[])"
                            default="jdbcAdapter"/>
  <ie:param name="CLASS" data="BLOBTEST"/>
  <ie:param name="ATTRIBUTE" data="FILECONTENT"/>
  <ie:param name="MIMETYPE" data="$(FORM[]mimetype[0])"/>
  <ie:param name="WHERE"
            data="(NAME='$(FORM[]filename[0])')"/>
  <ie:param name="GROUP_OUT" data="STATUS"/>
</ie:webject>