やりたいこと
Classic ASPでファイルアップローダーを作る。
BASP21ライブラリなしでできないか?
こちらのサイトに解説がありました。
送信されたバイナリの改行コードからフォーム情報を特定する方法でした。
フォーム項目が多いほど、改行位置からの特定が難しくなるのでBASP21を使った方が適切だと思います。
環境・ツール
- Windows Server 2016
- IIS
- VBScript
- BASP21
BASPのダウンロード・インストール
BASP21のDown 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さんが気に入ってそのままコンポーネント名になったそうです。
読み方は「ビーエーエスピー にじゅういち」が本来の呼び方らしいですが、「ばすぷにーいち」と呼ばれているそう。