ASP (Active Server Page) は Microsoft の製品であり、プログラミングが簡単で、強力な機能を備えた動的な Web サイトを迅速に開発できるため、現在、多くの Web サイト (特にイントラネット/エクストラネット イントラネット) で NT+IIS+ASP モデルが採用されています。 current Web サイト開発でより一般的なスクリプト言語。 WEB サービスでは、ファイル アップロード サービスは非常に一般的な機能ですが、WIN9X 上の PWS は関連コンポーネントを提供しません。NT 上の IIS は Post を提供します。 Acceptor コンポーネントですが、ユーザーの WWW アクセス権をチェックするため、使いにくいです。関連コンポーネントをインターネットからダウンロードすることもできますが、これらのほとんどは商用コンポーネントであり、ダウンロードに使用されるのは試用版です。時間や機能に制限があります。 ASP は標準の OLE/COM コンポーネントを呼び出すことができるため、VB/VC/DELPHI などの高度なプログラミング ツールを使用して、独自の要件に従って独自の ASP ファイル アップロード コンポーネントをカスタマイズし、独自のアプリケーション システム要件を満たすことができます。
以下では、DELPHI を使用して ASP 用のファイル アップロード コンポーネントを開発する原理と具体的な実装プロセスについて説明します。
1. ファイルアップロードの実装原理
Web ベースのデータのアップロードは RFC1867 標準に準拠する必要があり、アップロードされたファイル データも例外ではありません。たとえば、次の HTML ページ ファイル (delphiup.htm) を使用してアップロード ファイルを選択します。
<!-- DelphiUp.htm: ファイル アップロード インターフェイス -->
<html><head><title>ファイルのアップロード</title></head><body>
DELPHI で書かれたファイル アップロード コンポーネントを使用してファイル アップロードを実装する
<form NAME="UploadForm" ACTION="delphiup.asp" METHOD="POST" ENCTYPE="multipart/form-data">
<p>ファイルを次の名前で保存します: <input TYPE=text NAME="名前を付けて保存">
<p>アップロードするファイルを選択してください: <input TYPE=file NAME="FileData">
<input type="submit" name="b1" value="アップロードの確認"> </p>
</form>
</body></html>
クライアントがファイル(「アップロードするファイルの内容は次のとおりです。」という内容の Test.TXT など)を選択し、 を押したとき
[アップロードの確認] ボタンをクリックしてデータを送信すると、サーバー側プログラムによって受信されるデータは次の形式になります。
------------------------7cf1d6c47c#13#10
コンテンツの配置: フォームデータ名 = "名前を付けて保存"#13#10#13#10
新しいファイル名#13#10
------------------------7cf1d6c47c#13#10
コンテンツの配置: フォームデータ名 = "ファイルデータ"; ファイル名 = "D: est.txt";
コンテンツタイプ: text/plain#13#10#13#10
アップロードするファイルの内容は次のとおりです。 #13#10
------------------------7cf1d6c47c#13#10
コンテンツの配置: フォームデータ名 = "b1"#13#10#13#10
アップロードを確認#13#10
------------------------7cf1d6c47c--
このうち、「--------------------------------7cf1d6c47c」は、フォーム内の各フィールドを区切るために使用される区切り文字です(形状);
#13#10 は、復帰文字と改行文字の DELPHI 表現です。このように考えると、各フォーム フィールドの情報の説明は区切り文字とキャリッジ リターンとライン フィードのペアで始まります #13#10; フォームのドメイン名は "name="" で始まり """ で終わります。 ; フォームフィールド 値は 2 つの復帰文字と改行文字 #13#10#13#10 で始まり、復帰文字と改行文字のペア #13#10# と区切り文字で終わります。 "filename="" で始まり、末尾の """ で終わります。これらのフラグを使用すると、フォーム フィールドの名前と値、およびアップロードするファイルの名前を取得できるため、ファイル データの読み取りと保存が可能になります。
2. ファイルアップロードの実装プロセス
前述のデータ形式を理解すれば、自分でファイル アップロード コンポーネントを作成することは難しくなくなります。
(1) ASPコンポーネントを作成するプロジェクトを開始する
DELPHI を使用して OLE オートメーション サーバーを開発する手順がよくわからない場合は、「エレクトロニクスとコンピュータ」、1999 年 06 号の記事「ASP 用の DELPHI を使用した OLE オートメーション サーバーの開発」を参照してください。
ここでは簡単に手順だけを紹介します。
1. ActiveX ライブラリプロジェクトを作成する
DELPHI で、メニュー [File="New...] を選択し、[新しい項目] ダイアログ ボックスの ActiveX タブで [ActiveX ライブラリ] を選択すると、DELPHI によって DLL プロジェクト PROject1 が自動的に作成されます。
2. オートメーションコンポーネントを作成する
DELPHI で、メニュー [File="New...] を選択し、[新しい項目] ダイアログ ボックスの ActiveX タブで [オートメーション オブジェクト] を選択し、[オートメーション オブジェクト ウィザード] にクラス名 (「UploadFile」など) を入力します。 「ダイアログボックス、インスタンス化」「複数」を選択「OK」をクリックすると、DELPHI は TLB (タイプ ライブラリ) ファイル Project1_TLB.PAS と PAS (ユニット) ファイル Unit1.PAS を自動的に作成します。タイプ ライブラリのデザイン ウィンドウで、Project1 の名前を MyUpload に変更すると、ファイル アップロード コンポーネントの OLE 登録コードは「MyUpload.UploadFile」になります。
3. ASPタイプライブラリの導入
ASP の 5 つの組み込みオブジェクト (Request、Response、Server、application、session) を使用するには、ASP タイプ ライブラリを導入する必要があります。主に、クライアントからサーバーに渡されるデータを読み取るために Request オブジェクトを使用します。
[プロジェクト]メニューの[タイプ ライブラリのインポート]を選択し、[タイプ ライブラリのインポート]ダイアログ ボックスの[タイプ ライブラリ]リストで[Microsoft Active Server Pages オブジェクト ライブラリ(バージョン)]を選択します。 2.0)" (このオプションが利用できない場合は、IIS3 以降または PWS4 以降がコンピュータにインストールされており、ASP.DLL が正しく登録されていることを確認してください)、D ELPHI は、必要な ASP オブジェクト タイプ宣言を含む TLB ファイル ASPTypeLibrary_TLB.PAS を自動的に作成します。
4. OnStartPage プロセスと OnEndPage プロセスを定義します
Server.CreateObject を使用して ASP ページ上に OLE オブジェクト インスタンスを作成する場合、WEB サーバーはそのメソッド OnStartPage を呼び出し、ASP アプリケーション環境情報をオブジェクトに渡します。 、このプロセス中にクライアント情報を取得できます。ASP ページで OLE オブジェクト インスタンスが解放されると、WEB サーバーはそのメソッド OnEndPage を呼び出し、このプロセス中にメモリの解放などの終了操作を実行できます。私たちのコンポーネントでは、OnStartPage メソッドを使用する必要があります。
OnStartPage メソッドは Unit1.PAS で定義する必要があります。 OnStartPage の関数プロトタイプは次のとおりです。
プロシージャ OnStartPage(AScriptingContext: IUnknown);
パラメータ AScriptingContext は、ASP の同じ名前の 5 つの組み込みオブジェクトに対応する 5 つの属性 (Request、Response、Server、Application、Session) を含む IScriptingContext タイプの変数です。
TLB 定義ウィンドウ (View="Type Library) でメソッド OnStartPage を IUploadFile に追加する必要があり、その宣言ステートメントは「procedure OnStartPage(AScriptingContext: IUnknown);」です。
(2) クライアントがアップロードしたデータの抽出
この作業は OnStartPage プロセスで実行できます。
AScriptingContextのプロパティRequest(IRequest型)のプロパティTotalBytes(リクエスト情報の内容長)とメソッドBinaryReadを利用することで、クライアントがアップロードしたリクエスト情報データをByte型配列に読み込み、RFC1867で定義されたデータ形式に変換することができます。データを分析および抽出するための標準。
1. まず、TUploadFile のいくつかのプライベート変数を定義します。
ユニット ファイル UP01.PAS (Unit1.PAS で保存) に ASPTypeLibrary_TLB.PAS (Uses) への参照を追加します。
それから参加してください
プライベート
FContentLength: LongInt; //リクエスト情報のコンテンツ長
FContentData: Variant;//コンテンツ データ。リクエスト情報の内容を配列形式で格納します。
FFileName, //アップロードするファイルの名前
FDelimeter: 文字列; //フォームフィールドの区切り文字
FScriptingContext: IScriptingContext;//ASP はコンテキスト コンテンツを処理します
FFileDataStart, //ファイルデータの開始位置
FFileDataEnd: LongInt; //ファイルデータの終了位置;
2.クライアントがアップロードしたリクエスト情報データを抽出する
//OnStartPage イベントで、ASP コンテキスト情報、リクエスト情報の内容、フォーム フィールドの区切り文字、ファイル データを取得します。
プロシージャ TUploadFile.OnStartPage(AScriptingContext: IUnknown);
変数
ARequest: IRequest; //WWW リクエスト オブジェクト
AOleVariant: OleVariant; //リクエスト情報の内容の長さを記録します。
intDelimterLength: integer;//区切り文字の長さ
longIndex、ALongInt、longPos : LongInt;
ContentData: AnsiString;//リクエスト情報の内容の文字列表現
strTemp: 文字列;
FindEndOfFileData: boolean;//ファイルデータの終了位置が見つかったかどうか
始める
//クライアントがアップロードしたリクエスト情報データを抽出
FScriptingContext := AScriptingContext as IScriptingContext;// ASP コンテキスト情報を取得します
ARequest := FScriptingContext.Request;//WWW リクエスト情報を取得
FContentLength := ARequest.TotalBytes;//リクエスト情報のコンテンツ長
//リクエスト情報の内容を配列形式で格納するための動的配列を作成します
FContentData := VarArrayCreate( [0,FContentLength], varByte );
//リクエスト情報の内容を配列に格納する
AOleVariant := FContentLength;
FContentData := ARequest.BinaryRead(AOleVariant);//リクエスト情報の内容を読み取る
//位置決めを容易にするために、リクエスト情報の内容を文字列に変換します。
コンテンツデータ := ';
longIndex := 0 から FContentLength - 1 の場合
始める
ContentData := ContentData + chr( Byte( FContentData[longIndex ] ));
if FContentData[longIndex ] = 0 then Break;//0 はコンテンツの終わりを示します
終わり;
3. 区切り文字を取得してファイル名をアップロードする
//フォームフィールドの区切り文字を取得する
longPos := pos( #13#10,ContentData );//キャリッジリターンとラインフィード文字の位置
FDelimeter := Copy( ContentData,1,longPos-1);//この位置より前のコンテンツが区切り文字です
//リクエスト情報内容のファイル名がソースパスで始まるファイル名を取得します。
// filename="パス/ファイル名" の形式でのストレージ
strTemp := 'filename="';//ファイル名は "filename="" の後にあります
longPos := pos( strTemp, ContentData );//「filename="」の位置を取得します
longPos <= 0 の場合
始める
Fファイル名 := ';
FFileDataStart := -1;
FFileDataEnd := -2;
出口;
終わり;
//次の二重引用符「"」より前の内容、つまりソースパスを含むファイル名を取得します。
longPos := longPos + length( strTemp );
strTemp := ';
longIndex := longPos から FContentLength の場合 - 1 を実行します
if ContentData[longIndex ] <> '"' then
strTemp := strTemp + ContentData[longIndex ]
それ以外の場合は壊れます。
FFileName := strTemp;
4. リクエスト情報コンテンツ内のファイルデータの開始位置と終了位置を取得する
//ファイルデータの開始位置はファイル名の後の最初の#13#10#13#10以降です
delete( ContentData, 1, longIndex );
strTemp := #13#10#13#10;
FFileDataStart := longIndex + pos(strTemp, ContentData) + length(strTemp) - 1;
//ファイルデータの終了位置は次の#13#10とデリミタより前です
//ファイルデータに不正な文字が含まれている可能性があるため、文字列位置決め関数 POS は使用できなくなります。
//次の区切り文字の位置を検索します
FFileDataEnd := FFileDataStart;
intDelimterLength := length( FDelimeter );
FindEndOfFileData := false;
while FFileDataEnd <= FContentLength - intDelimterLength do
始める
FindEndOfFileData := true;
ALongInt := 0 から intDelimterLength - 1 の場合
if Byte( FDelimeter[ ALongInt + 1 ] ) <>
FContentData[FFileDataEnd + ALongInt] then
始める
FindEndOfFileData := false;
壊す;
終わり;
FindEndOfFileData の場合は中断します。
FFileDataEnd := FFileDataEnd + 1;
終わり;
FindEndOfFileData でない場合は FFileDataEnd := FFileDataStart - 1//区切り文字が見つかりません
else FFileDataEnd := FFileDataEnd - 3;//区切り文字、前方へスキップ #13#10
終わり;
(3) ASPプログラムへの情報送信
操作 (2) を実行した後、アップロード コンポーネントは要件に従って ASP プログラムにデータを渡すことができます。現在利用可能なデータには、クライアント ソース ファイル名 (FFileName、パスを含む)、ファイル サイズ (FFileDataEnd-FFileDataStart+1) が含まれます。
まず、次の 2 つのメソッド GetFileName と GetFileSize を TLB 設計ウィンドウで宣言する必要があります。
1. クライアントのソース ファイル名 (パスを含む) を返します。
//クライアントのソースファイル名(パスを含む)を返す
関数 TUploadFile.GetFileName: OleVariant;
始める
result := FFileName;//クライアントのソースファイル名(パスを含む)
終わり;
2. ファイルサイズを返す
//ファイルサイズ(バイト)を返す
関数 TUploadFile.GetFileSize: OleVariant;
始める
結果 := FFileDataEnd - FFileDataStart + 1;
終わり;
(4) ファイルの保存
操作 (2) を実行した後、アップロード コンポーネントは ASP プログラムの要件に従ってファイルを保存できます。まずそれが入っているはずです
次の 2 つのメソッド、SaveFileAs と SaveFile は、TLB 設計ウィンドウで宣言されています。
1. 指定したファイル名でファイルを保存します。
//指定されたファイル名に従ってファイルを保存します。パラメータ FileName は、指定されたファイル名です。戻り値 True は、ファイルが正常に保存されたことを示します。
関数 TUploadFile.SaveFileAs(ファイル名: OleVariant): OleVariant;
変数
longIndex : LongInt;
AFile: file of byte;//ファイルをバイナリ形式で保存します
byteData : バイト;
始める
結果:= true;
試す
assign(Aファイル, ファイル名);
リライト(Aファイル);
longIndex の場合:= FFileDataStart から FFileDataEnd まで
始める
byteData := Byte( FContentData[longIndex ] );
Write(AFile, byteData);
終わり;
CloseFile( AFile );
を除外する
結果:= false;
終わり;
終わり;
2. デフォルトのファイル名でファイルを保存します。
//デフォルトのファイル名に従ってファイルを保存し、呼び出しページが配置されているディレクトリに同じ名前でファイルを保存します
関数 TUploadFile.SaveFile: OleVariant;
変数
現在のファイルパス:文字列;
始める
//呼び出しページが配置されているディレクトリを取得します
CurrentFilePath := FScriptingContext.Request.ServerVariables['PATH_TRANSLATED'];
現在のファイルパス := ExtractFilePath( 現在のファイルパス );
//ファイルを保存
結果 := SaveFileAs( CurrentFilePath + ExtractFileName( FFileName ));
終わり;
3. アップロードコンポーネントの適用例
この例では、DelphiUp.HTM はファイル アップロード インターフェイスであり、DelphiUp.ASP はファイル アップロード操作の実行に使用されます。
DelphiUp.ASP のコードは次のとおりです。
<!--DelphiUp.ASP: ファイルアップロード処理ページ-->
<html><head><title>ファイルのアップロード</title></head><body>
<% dim アップロード、ファイル名
set Upload = Server.CreateObject("MyUpload.UploadFile")
ファイル名 = Upload.GetFileName
Response.Write "<br>ファイル ""&FileName&"" を保存しています..."
Upload.SaveFile の場合、
Response.Write "<br>ファイル ""&FileName&"" は正常にアップロードされました。"
Response.Write "<br>ファイル サイズは "&Upload.GetFileSize&" バイトです。"
それ以外
Response.Write "<br>ファイル ""&FileName&"" のアップロードに失敗しました。
終了する場合
アップロード=何も設定しない %>
</body></html>
4. いくつかの説明
1. DELPHI によって自動生成されたソース コードからコンパイルされた DLL ファイルのサイズは 215K で、次の場所にあります。
ASPTypeLibrary_TLB.PAS の Interface セクションで、Uses 内の ActiveX を除くすべてのユニットを削除します。
MyUpload_TLB.PAS の Uses 内のすべてのユニットを削除すると、生成される DLL ファイルのサイズを 61K に減らすことができます。
2. 上記の方法は CGI プログラムにも適用できますが、TWebRequest オブジェクトを使用する必要があります。
上記のプログラムはデバッグされ、PWIN98+Delphi3.0+PWS4.0 で渡されました。