猫とコード

化学メーカーでweb開発している猫大好きエンジニアの備忘録です。

Classic ASPでファイルアップローダーを作る

やりたいこと

Classic ASPでファイルアップローダーを作る。

BASP21ライブラリなしでできないか?

こちらのサイトに解説がありました。 送信されたバイナリの改行コードからフォーム情報を特定する方法でした。

フォーム項目が多いほど、改行位置からの特定が難しくなるのでBASP21を使った方が適切だと思います。

環境・ツール

BASPのダウンロード・インストール

BASP21Down Load! Bsmtp20070629-587.lzh(119KB)からダウンロード

実装

<%@ Language=VBScript %>
<%

%>
<html>
<body>
    <form method="POST" ENCTYPE="multipart/form-data" >
        <input type=file  name=img accept="image/*" >
        <br>
        <input type=submit formaction=test_basp.asp>
    </form>
</body>
</html>
<%@ Language=VBScript %>
<%
dim total_bytes

' 1.総バイト数を読み込み
total_bytes = Request.TotalBytes
response.write("totalbytes:" & total_bytes & "<br>")

' 2.basp objを宣言
Set bobj = Server.CreateObject("basp21")

' 3.バイナリ読込
barray = Request.BinaryRead(total_bytes)

uploadDir = "D:\~~\dir\" ' サーバの保存先パスを指定する
filename = bobj.FormFileName(barray,"img")

' 4.サーバに保存
wblen = bobj.FormSaveAs(barray,"img",uploadDir & filename)
response.write("wblen:" & wblen & "<br>")

%>

解説

1.総バイト数を読み込み

Request.TotalBytesでフォームから送信された総バイト数を取得します。 その下のResponse.Write(...は取得した総バイト数を表示しているだけです。

2.basp objを宣言

BASP21オブジェクトを作ってます。

3.バイナリ読込

barray = Request.BinaryRead(total_bytes)で総バイト数を引数にして全バイナリをbarrayに読み込みます。 bobj.FormFileName(barray,"img")imgというnameのフォームのバイナリを取得します。

4.サーバに保存

bobj.FormSaveAs(barray,"img",uploadDir & filename)でサーバにバイナリデータをファイルとして保存します。 1つ目の引数barray・・・全バイナリデータ(barray)から探す。 2つ目の引数img・・・name=imgのフォームのバイナリデータを取得。 3つ目の引数uploadDir & filename・・・uploadDirのディレクトリに、filenameの名前で保存する。

wblenは成功時は正の数字で書き込んだバイト数が表示されます。 マイナスの時はエラーメッセージです。BASP21 proのメッセージリファレンスから内容確認できます。

備考

ENCTYPE="multipart/form-data"を指定するとRequest.Fromで値を取得できなくなるので、bobj.FormBinaryを使うことになります。

よもやま話

BASP21って何だろうと思ってたんですが、babaqさんの開発されたASPコンポーネントだからBASP、21は最初はバージョン番号だったらしいですが、babaqさんが気に入ってそのままコンポーネント名になったそうです。 読み方は「ビーエーエスピー にじゅういち」が本来の呼び方らしいですが、「ばすぷにーいち」と呼ばれているそう。

出典:Baba Centerfolds FAQ