著者: Zhui Feng は、
長い間 ASP を使用して Web サイト アプリケーションを作成してきました。その中で、おそらく最も一般的な問題は、ファイルをアップロードする方法です。 NetEase 仮想コミュニティが提供するものと同様の「1 日あたり 1 つ星」機能を自分のコミュニティに実装するには、ネチズンが写真をアップロードする機能を提供する必要があります。画像ファイルをサーバーにアップロードするには、さまざまな無料のファイルアップロードコンポーネントを使用できますが、多くの場合、ASP がサポートする無料のスペースを使用するか、他の人の仮想スペースを借りることしかできません。 2 番目のケースと同様に、ファイル アップロード コンポーネントを使用することは単純に不可能であり、多額の「お金」を支払わなければなりません。独自の仮想ホストを持っていない限り、必要なコンポーネントをサーバーに簡単にインストールできますが、この状況はほとんどの人にとって手の届かないものです。それでは、私たちにできることは何もないのでしょうか?はは、答えはイエスです(もちろんイエスです。そうでなければこの記事を書くことはできません)。純粋な ASP コードを使用して、画像をアップロードしてデータベースに保存する機能を実装してみましょう (ちなみに、データベース内の画像を Web ページに表示する機能も実装します)。
まず、使用するオブジェクト メソッドについて理解しましょう。通常、前のページから渡されたデータを取得するには、Request オブジェクトを使用します。同様に、Request オブジェクトを使用して、アップロードされたファイル データを取得することもできます。使用されるメソッドは、Request.BinaryRead() です。データベースから画像データを読み取り、Web ページに表示するために使用する方法は次のとおりです。
Request.BinaryWrite()。画像データを取得してデータベースに保存する場合、Insert ステートメントを使用してデータベースを直接操作することはできません。代わりに、データベース内の画像データを読み取るには、ADO の AppendChunk メソッドを使用する必要があります。 GetChunk メソッド。各メソッドの具体的な構文は次のとおりです。
*Request.BinaryRead 構文:
バリアント=Request.BinaryRead(カウント)
パラメータ
変異体
戻り値には、クライアントから読み取られたデータが保持されます。
カウント
クライアントから読み取られるデータの量を示します。この値は、Request.TotalBytes メソッドを使用して取得されるデータの量以下です。
*Request.BinaryWrite 構文:
Request.BinaryWritedata
パラメータ
データ
クライアントのブラウザに書き込まれるパケット。
*Request.TotalBytes 構文:
バリアント=Request.TotalBytes
パラメータ
変異体
クライアントから読み取られたデータのバイト数を返します。
*AppendChunk 構文は、大きなテキスト、バイナリ データのフィールドまたはパラメータ オブジェクトにデータを追加します。
object.AppendChunkData
パラメータ
objectField または Parameter オブジェクト
オブジェクトに追加されたデータを含むデータ バリアント タイプ。
説明 Field または Parameter オブジェクトの AppendChunk メソッドを使用して、長いバイナリ データまたは文字データをオブジェクトに入力します。システム メモリが制限されている場合は、AppendChunk メソッドを使用して、長整数値に対してすべてではなく一部の操作を実行できます。
*GetChunk 構文は、大きなテキストまたはバイナリ データの Field オブジェクトの内容のすべてまたは一部を返します。
変数=フィールド.GetChunk(サイズ)
戻り値はバリアント型を返します。
パラメータ
サイズの長い整数式。取得するバイト数または文字数に等しい。
説明 Field オブジェクトの GetChunk メソッドを使用して、その長いバイナリ データまたは文字データの一部またはすべてを取得します。システム メモリが制限されている場合は、GetChunk メソッドを使用して、すべてではなく一部の長整数値を処理できます。
GetChunk 呼び出しによって返されたデータは、「変数」に割り当てられます。サイズが残りのデータより大きい場合、
GetChunk は、「変数」を空白で埋めることなく、残りのデータのみを返します。フィールドが空の場合は、
GetChunk メソッドは Null を返します。
後続の GetChunk 呼び出しはそれぞれ、前の GetChunk 呼び出しが中断したところからデータを取得します。ただし、あるフィールドからデータを取得してから、現在のレコードの別のフィールドの値を設定または読み取る場合、ADO はデータが最初のフィールドから取得されたものとみなします。 GetChunk メソッドが最初のフィールドで再度呼び出される場合、ADO はその呼び出しを新しい GetChunk 操作として解釈し、レコードの先頭から読み取りを開始します。他の Recordset オブジェクトが最初の Recordset オブジェクトのコピーでない場合、そのオブジェクト内のフィールドにアクセスしても GetChunk 操作は中断されません。
Field オブジェクトの Attributes プロパティの adFldLong ビットが True に設定されている場合、フィールドで GetChunk メソッドを使用できます。
Field オブジェクトに対して Getchunk メソッドを使用するときに現在のレコードがない場合、エラー 3021 (現在のレコードがありません) が生成されます。
次に、テストとしてデータベースを設計します。データベース構造は次のとおりです (access2000)。
フィールド名 タイプ 説明 ID 自動番号 主キー値
img OLE オブジェクトは画像データを保存するために使用されます
MSSQLServer7 の場合、対応する構造は次のとおりです。
フィールド名 タイプ 説明 id int (Identity) 主キー値
img imageは画像データの保存に使用されます
ここで、純粋な ASP コードのアップロード部分を正式に記述し始めます。まず、ユーザーがアップロードする画像を選択できるアップロード インターフェイスを用意します。コードは次のとおりです (upload.htm)。
<html>
<本文>
<中央>
<form name="mainForm" enctype="multipart/form-data" action="process.asp" method=post>
<inputtype=filename=mefile><br>
<inputtype=submitname=okvalue="OK">
</form>
</center>
</body>
</html>
enctype="multipart/form-data" はフォームにこの属性が必要であることに注意してください。そうでない場合、アップロードされたデータは取得されません。次に、process.asp でブラウザから取得したデータに必要な処理を実行する必要があります。 process.asp で取得したデータには、必要なアップロードされた写真のデータだけでなく、その他の役に立たない情報も含まれているためです。冗長データを削除し、処理した画像データをデータベースに保存します。 ここでは、access2000 を例に説明します。具体的なコードは次のとおりです (process.asp)。
<%
応答.バッファ=true
formsize=request.totalbytes
formdata=request.binaryread(フォームサイズ)
bncrlf=chrB(13)&chrB(10)
ディバイダ=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(フォームデータ,データ開始,データ終了)
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.レコードセット")
rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3
新規追加
rec("img").appendchunkmydata
記録更新
再クローズ
setrec=何もなし
setconnGraph=なし
%>
これで、アップロードされた画像がimages.mdbという名前のデータベースに保存されました。残りの作業は、データベース内の画像データをWebページに表示することです。通常、HTMLでは<IMG>タグ、つまり<IMGSRC="画像パス">を使用して画像を表示しますが、画像はデータベースに保存されます。笑、実際には、パスの指定に加えて、この SRC 属性は次のように使用することもできます。
<IMGSRC="showimg.asp?id=xxx">
したがって、必要なのは showimg.asp 内のデータベースから修飾されたデータを読み取り、それを SRC 属性に返すことだけです。具体的なコードは次のとおりです (showimg.asp)。
<%
setconnGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=server.createobject("ADODB.レコードセット")
strsql="selectimgfromimageswhereid="&trim(request("id"))
rec.openstrsql,connGraph,1,1
Response.ContentType="画像/*"
Response.BinaryWriterec("img").getChunk(7500000)
再クローズ
setrec=何もなし
setconnGraph=なし
%>
ブラウザに出力する前に、Response.ContentType="image/*" を指定する必要があることに注意してください。
画像を正常に表示するために。
最後に注意すべきことは、私の process.asp の処理では、最初のページ (upload.htm) に <INPUT type=tesxt name=userid> などの他のデータがあることが考慮されていないことです。これらの項目がある場合、process.asp は不要なデータの処理に注意を払う必要があります。