<フォームアクション=upload.aspメソッド=post enctype=multipart/form-data>
アップロードファイル:<入力種類=ファイル名=file1><br>
<入力タイプ=送信名=アップロード値=アップロード>
</フォーム>
このうち、enctype パラメータは、ファイルをアップロードするとき (または同時にテキスト ボックスを含むとき) に、その属性を multipart/form-data に設定するために使用されます。受信したサーバー側のバイナリ ファイル。ストリーム処理用の ASP プログラムについては、この記事の後半で紹介します。
2. アップロードファイル形式の分析
ファイルを処理する前に、アップロードされたファイルの特定の形式を理解する必要があります。次の簡単な ASP プログラムを作成することで、そのバイナリ コードを表示できます。
<%
filesize=Request.TotalBytes 'アップロードされたファイルのサイズを取得します
filedata=Request.BinaryRead(filesize) 'アップロードされたファイルのバイナリデータを取得します
Response.BinaryWrite filedata 'バイナリデータをブラウザ上に表示します
%>
ブラウザに表示されたアップロードされたファイルのバイナリコードを解析すると、コードは4つの部分で構成されていることがわかりました(複数のファイルまたはテキストボックスを同時にアップロードした場合、コードはアップロードされた順に同じ形式で配置されます) )、各部分の内容は改行文字で区切って入力します。
1)前半部分(スタートフラグ)
------------------------7d329631b04d4
2) パート 2 (文書の説明)
コンテンツの配置: フォーム データ; ファイル名 = C:/Documents and Settings/Administrator/My Documents/Invitation.doc コンテンツの種類: application/msword
ここでは、アップロードされたファイルのファイル名と絶対パス、およびファイルの種類を取得できます。この情報はファイルを正しく保存するために不可欠です。
3) パート 3 (文書の内容)
つまり、ファイルのバイナリ コンテンツが省略されます。
4) その4(エンドマーク)
------------------------7d329631b04d4
第 1 部と第 4 部の内容を合わせると、----------------------------7d329631b04d4 (値はアップロードのたびに異なります) ) 同) は、(アップロードされたコンテンツが複数ある場合に) 1 つのデータの始まりと終わりを示す区切り文字の役割を果たします。ファイルを保存するために必要な情報に関しては、まずデータの 2 番目の部分のファイル名からファイル名を取得する必要があります。次に、ファイルの開始位置を正確に特定し、最後に ASP テクノロジを使用して保存する必要があります。元のファイル名を持つバイナリ ファイル。複数のコンテンツ(複数のテキストボックスやファイルなど)を同時にアップロードした場合、各コンテンツの各部分は区切り文字に含まれて同様に処理されますが、テキストボックスとファイルの表現方法は若干異なります。これは、バイナリ コードを具体的に分析して理解することで実行できます。
3. ASP テクノロジーを使用してファイル ストレージを実装する
アップロードされたファイルコードの処理
1) 区切りコードを取得する
上記の分析から、セパレーターが複数のデータ セグメント (テキスト ボックスやさまざまな種類のファイルを含む) を分割する際に重要な役割を果たすことがすでにわかっています。以前に分析したように、区切り記号は最初の復帰記号と改行記号の前に表示されます。したがって、区切り文字コードは次のプログラムを通じて取得できます。
<%
newline=chrB(13) & chrB(10) '改行はバイナリの復帰文字を表します
filesize=Request.TotalBytes 'filesize はアップロードされたファイルのサイズです
filedata=Request.BinaryRead(filesize) 'filedata はアップロードされたファイルのバイナリ データです
Division=leftB(filedata,clng(instrb(filedata,newline))-1) 'divider はディバイダです
%>
注: ここではバイナリ バイトコードを扱っているため、すべての関数は b が追加されたバイナリ バージョンを使用します。
2) ファイル (またはテキスト ボックス) の内容を取得します。
(1) 準備機能(バイナリ文字列を文字列に変換)
アップロードされたファイルの内容は、バイナリから文字列への変換プロセスを経る必要がなく、直接保存できます。ただし、テキスト ボックスの内容またはファイル名を抽出する必要がある場合は、変換を実行する必要があります。したがって、漢字に適した汎用変換関数を記述する必要があります。以下は関数コードです。
機能BtoS(bstr)
そうでない場合は Null (bstr)
i = 0 から lenb(bstr) - 1 まで
bchr = midb(bstr,i+1,1)
if ascb(bchr)>127 then '中国語の文字は 2 バイトであるため、2 つの文字を一緒に処理する必要があります
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))
i = i+1
それ以外
temp = temp&chr(ascb(bchr))
終了の場合
次
終了の場合
BtoS=温度
終了機能
(2) ファイル(またはテキストボックス)の内容を取得する
実際の WEB アプリケーションでは、アップロード操作に複数のテキスト ボックスや複数のファイルなどの複数のコンテンツが含まれる場合があります。ファイルとテキスト ボックスは、ファイル データに filename= 文字列が含まれているため、簡単に区別できます。したがって、ファイルの内容とテキスト ボックスの内容の両方を抽出するために使用できる次の一般的な関数を作成しました (バイナリ変換が必要です)。
Function getdata(byval data, byval dider,final) 'data はバイナリ文字列を表し、final はデータの終了位置を表します。
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) '文字列 filename= のバイナリ表現
bncrlf=chrb(13)&chrb(10) 'バイナリキャリッジリターン文字
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) '開始位置
endpos = instrb(startpos,data,divider)-lenb(bncrlf) '終了位置
part1 = midb(data, startpos, endpos-startpos) '2 つのセパレータ間の内容
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' コンテンツの前の説明段落
If (instrb(firstline,filename)=0) then 'テキスト ボックスの場合は、テキスト ボックスの文字列の内容を取得します
stemp=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
getdata=BtoS(stemp)
Else 'ファイルの場合は、ファイルのバイナリ コンテンツを取得します
Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (part1)
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))
終了の場合
最終=エンドポス
終了機能
この関数をプログラム内で直接呼び出すと、次のように必要なファイル (またはテキスト ボックス) の内容を取得できます。
<%
Content=getdata (データ、ディバイダ、位置)
%>
3) ファイル名を取得する
以前に分析したように、アップロード ファイル データ ストリームの filename= フィールドには、ファイルの名前と絶対パスが含まれています。一般に、パス内のファイル名を抽出するだけで済みます。プログラム コードは次のとおりです。
<%
namepos=instrrev(B2S(firstline),chr(92)) 'firstlineは上記で取得した記述部分のデータ、chr(92)
急行/
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) 'ファイル名を取得します
%>
ASPを利用してファイルアップロード機能を直接実装
従来の ASP プログラマは、FILESYSTEMOBJECT オブジェクトを使用して、テキスト ファイル (.txt) の移動、コピー、削除などの操作のみを行うことができ、バイナリ オブジェクトを処理する必要がある場合は、この記事で前に紹介した方法を使用する必要があります。ただし、ASP の ADO.STREAM オブジェクトはテキスト オブジェクトとバイナリ オブジェクトを同時に操作できるようになり (http://www.microsoft.com/data からダウンロードできます)、これを使用してファイル アップロードを直接実装できるようになりました。 ASPの機能です。以下にその導入プロセスを紹介します。
1) STREAM オブジェクトを開きます
SREAM オブジェクトの場合、ファイルを保存する場合は、オブジェクトの内容全体を保存する必要があります。したがって、2 つ (またはそれ以上) の STREAM オブジェクトを作成する必要があります。そのうちの 1 つは、最初のバイナリ データを受け取るソース データ ストリームであり、もう 1 つは、ソース データ ストリームから処理されたデータを受け取る宛先データ ストリームです。目的のファイルに保存します。
<%
set str=server.CreateObject(ADODB.Stream) 'str はソース データ ストリームです
str.Mode=3 'オープンモードを設定します。3は読み取りおよび書き込み可能です。
str.Type=1 'データ型を設定します。1はバイナリデータです
str.Open
set desc=server.CreateObject(ADODB.Stream) 'desc はターゲット データ ストリームです
説明モード=3
説明タイプ=1
説明開く
%>
2) STEAM オブジェクト間でコンテンツをコピーする
この部分では、ファイルを宛先データ ストリームに正しくコピーしてファイルを保存する前に、ソース データ ストリーム内のファイルの先頭を見つけてファイルの内容の長さを見つける必要があります。プログラム コードは次のとおりです。
<%
formdata=Request.BinaryRead(Request.TotalBytes) 'formdata はアップロードされたすべてのコンテンツです
str.Write formdata ' 割り当てソース データ ストリーム
str.position=count-lenb(result)-2 'positionはファイルの先頭を指します
str.copyto desc, lenb(filecotent) 'lenb(filecontent) はファイルの長さを表します
desc.SaveToFile fullpath,2 'フルパスで指定されたパスと名前でファイルを保存します
%>
3) STEAMオブジェクトを閉じる
プログラミングが完了したら、次のように STEAM オブジェクトを閉じて解放する必要があります。
<%
説明を閉じる
desc=nothing を設定します
閉じる
STR=何も設定しない
%>
要約する
本記事では、本機で開発した情報管理システムでよく利用されている、ASPを利用したファイルアップロードを直接実装する方法を紹介します。実践により、この方法はいくつかの従来のファイル アップロード方法よりも簡単で効率的であることが証明されています。