概要
この記事では、XML テクノロジーを使用してファイルをアップロードする例について説明します。この方法には従来の方法の制限がありません。 この例では、MSXML3.0 と ADO Stream オブジェクトを使用して、この新しいアップロード メソッドを実装する方法を説明します。専用のアップロード コンポーネントが必要ないなど、多くの利点があります。
導入
HTML Web ページでアップロード機能を取得するには、クライアントで次の形式の FORM を使用できます:
<FORM NAME="myForm"
ACTION="ターゲットURL.asp"
ENCTYPE="マルチパート/フォームデータ"
METHOD="投稿">
<INPUT TYPE="ファイル" NAME="myFile">
<INPUT TYPE="送信" VALUE="ファイルのアップロード">
</FORM>
このソリューションには、クライアントとサーバーの両方の使用に関して多くの制限があります。まず、GET メソッドではこのようなフォーム データを処理できないため、POST メソッドを使用する必要があります。また、フォームを使用せずに POST アクションをトリガーする方法はありません。データをフォーム ハンドラーに送信した後、ブラウザーはハンドラーを新しいページとして読み込み、ユーザーには不快なページ遷移が表示されます。
ENCTYPE 属性は、フォームの MIME エンコード方式を定義します。ファイルをアップロードするためのフォームの ENCTYPE 属性は、「multipart/form-data」を使用する必要があります。この属性を「multipart/form-data」に設定すると、ASP の Request オブジェクトがそのようなフォーム コンテンツにアクセスできない従来の構造とは異なる POST バッファー (複合構造) が作成されます。したがって、Request.binaryRead メソッドを使用してこのデータにアクセスできますが、スクリプト言語を使用してアクセスすることはできません。 Request.binaryRead メソッドは、VTaray 型のデータ (符号なしの半角文字のみを含む Variant 型の配列) を返します。ただし、スクリプト言語はバリアント型データのみを処理できます。この問題を解決するには、専用の ASP アップロード コンポーネント、または CPSHOST.DLL などの ISAPI 拡張機能のみを使用できます。これは設計上の制限です。
新しいアップロード計画は
次の手順に従う必要があります。
クライアント:
MSXML 3.0 を使用して、バイナリ コンテンツの XML ノードを作成します。ADO Stream オブジェクトを使用して、アップロードされたファイル データをノードに配置します。XML ドキュメントを Web サーバーに送信します
。側:
Request オブジェクトから XML ドキュメントを読み取り、バイナリ ノード内のデータを読み取り、サーバー上のファイルに保存します。もちろん、データベースの BLOB フィールドに保存することもできます。
このコードを説明する前に、このソリューションについて少し考えてみましょう。
XML についての考え方
XML 形式は、数値、浮動小数点、文字などの多くのデータ型をサポートしています。多くの作成者は XML を ASCII 形式として定義していますが、XML テクノロジではバイナリ情報を記述するために「bin.base64」データ型も使用できることを無視することはできません。この機能は MS XML3.0 パーサーで完全にサポートされていますが、現在はいくつかの特別な設定が必要です。このオブジェクトは、バイナリ データを完全に制御できるようにするいくつかのプロパティを提供します。
obj_node.dataType - この読み取り/書き込みプロパティは、特定のノードのデータ型を定義します。 MSXML パーサーは、より多くのデータ型をサポートしています (MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htmを参照)。
バイナリ データの場合は、「bin.base64」タイプを使用できます。
obj_node.nodeTypedValue - この読み取り/書き込みプロパティには、指定されたタイプに関して指定されたノードを表すデータが含まれます。
アップロードされたファイルを含む複数の bin.base64 タイプのノードを含む XML ドキュメントを作成できます。この機能を使用すると、1 つの POST を使用して複数のファイルを一度にアップロードできます。
XMLHttpRequest オブジェクトと POST メソッドを使用して、XML ドキュメントを Web サーバーに送信できます。このオブジェクトは、クライアント側のプロトコル サポートを HTTP サーバーに提供し、Web サーバー上で MS XMLDOM オブジェクトを送受信できるようにします。 XMLHttpRequest は Internet Explorer 5 の組み込み COM オブジェクト (カスタム インストールは必要ありません) であり、送信後にページを変換する必要はありません。
ADO Stream オブジェクトについて考える
クライアント側で 1 つ以上のバイナリ ノードを含む XML ドキュメントを作成できます。また、ノードにファイルの内容を入力する必要があります。残念ながら、スクリプト言語はローカル ファイル システムにアクセスできず、Scripting.FileSystem オブジェクト (Win32 システムの組み込みオブジェクト) は今のところバイナリ ファイルにアクセスできません。これは設計上の制限です。したがって、ローカル バイナリへのアクセスを提供できる別の COM オブジェクトを見つける必要があります。
ADO Stream オブジェクト (MDAC 2.5 のコンポーネント) は、バイナリ ストリーム データの読み取り、書き込み、および管理の手段を提供します。バイト ストリームの内容はテキストまたはバイナリ データであり、容量制限はありません。 ADO 2.5 では、Microsoft が導入した Stream オブジェクトは ADO オブジェクト構造のどの層にも属さないため、バンドルせずにオブジェクトを使用できます。
この記事では、Stream オブジェクトを使用してファイルのコンテンツにアクセスし、そのコンテンツを XML ノードに保存します。
クライアント側の
、Stream オブジェクトと MSXML オブジェクトを使用してファイル アップロード アクションを完了します。
<HTML>
<HEAD><TITLE>ファイル送信</TITLE></HEAD>
<本体>
<INPUT id=btn_send name="btn_send" type=button value="ファイル送信">
<DIV id=div_message>準備完了</DIV>
</BODY>
</HTML>
<SCRIPT LANGUAGE=javascript>
// アップロード関数
関数 btn_send.onclick()
{
//ADOストリームオブジェクトを作成する
var ado_stream = new ActiveXObject("ADODB.Stream");
// デフォルトのヘッダー情報とルート ノードを含む XML ドキュメントを作成します。
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
//データ型を指定
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// 新しいノードを作成し、バイナリ データ ノードとして設定します。
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
//Streamオブジェクトを開いてソースファイルを読み込みます
ado_stream.Type = 1=1=adTypeBinary;
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\myfile.doc");
// ファイルの内容を XML ノードに保存します
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll;
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// 複数のバイナリ ノードを作成し、複数のファイルを一度にアップロードできます
// XML ドキュメントを Web サーバーに送信します
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// サーバーから返された情報を表示します
div_message.innerHTML = xmlhttp.ResponseText;
}
</スクリプト>
サーバー側の
、同じオブジェクトを使用してサーバー側のアップロード処理機能を提供します。
<%@ LANGUAGE=VBScript%>
<% 明示的なオプション
Response.Expires = 0
' 変数とオブジェクトを定義します。
薄暗いado_stream
dimxml_dom
dim xml_file1
'ストリームオブジェクトの作成
set ado_stream = Server.CreateObject("ADODB.Stream")
' Request オブジェクトから XMLDOM オブジェクトを作成します
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(リクエスト)
'バイナリデータを含むノードを読み取る
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Stream オブジェクトを開いてデータを格納します
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
'ファイル保存
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
' オブジェクトを破棄します
ado_stream = なしを設定します
xml_dom = なしを設定します
'情報をブラウザに返す
応答。「アップロードに成功しました!」と書き込みます。
%>
Stream オブジェクトを使用して、データベースの BLOB フィールドにデータを入力することもできます。
この方法を使用する利点は、
ページ変換が発生しないことです。
特別なコンポーネントは必要ありません。
複数のファイルを同時にアップロードできます。
このプログラムは純粋なスクリプトで書かれており、HTML オブジェクトの協力なしで他のコードに簡単に挿入できます。このロジックは、COM 標準をサポートする任意の言語でも実装できます。
システム セキュリティに関する考慮事項:
この方法は、IE5 のセキュリティ レベルを「低」に設定する必要があるため、内部ネットワークでのみ使用できます。必須:
スクリプトと ActiveX オブジェクトを許可します。この設定により、ブラウザは「myobj = new activexobject(...)」のような JScript ステートメントを実行できるようになります。
データ ソースへのクロスドメイン アクセスを許可する必要があります。この設定により、クライアント側で Stream オブジェクトを使用できるようになります。 MS XML DOM 3.0 および MDAC 2.5 もサーバーとクライアントの両方にインストールする必要があります。