やりたいこと
BASP21ライブラリなしでできないか?
こちらのサイトに解説がありました。 送信されたバイナリの改行コードからフォーム情報を特定する方法でした。
フォーム項目が多いほど、改行位置からの特定が難しくなるので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さんが気に入ってそのままコンポーネント名になったそうです。 読み方は「ビーエーエスピー にじゅういち」が本来の呼び方らしいですが、「ばすぷにーいち」と呼ばれているそう。