ASP.Classic(VBScript)を使用してクライアントからサーバへファイルをアップロードする方法については
多くの要素を理解する必要があります。
例をあげると ・入力時のformにて enctype=multipart/form-data を指定し、ポストデータを送信する ・送信データを Request.BinaryRead(Request.TotalBytes) にて取得する ・2バイト文字を判別し、適切に処理する ・POSTデータの必要部分の切り分けを行う などがあります。
具体的には以下のサンプルにより、クライアント側の任意のファイルをサーバ側のASPファイル設置ディレクトリへアップロードすることが出来ます。 以前は、ASPにはバイナリI/Oが存在しないためExcel等のバイナリファイルをアップロードできないと紹介していましたが、Streamオブジェクトを使用することによりバイナリファイルのアップロードも可能であることがわかりました。
<%@language=VBscript%>
<%Option Explicit%> <html> <head> </head> <body> <% Dim ObjStream Dim nByte,P_Data,Target,B_Data Dim i Dim S_LOC,E_LOC,FN_SEARCH,SAVE_FN '***アップロード用制御器の表示
Response.Write "<form name=main method=POST enctype=multipart/form-data>" Response.Write "<input type=file name=up_file>" Response.Write "<input type=submit name=send value='UPLOAD'>" Response.Write "</form>" If Request.TotalBytes then Set ObjStream = Server.CreateObject("ADODB.Stream") ObjStream.Open '***ストリームタイプをバイナリへ設定 ObjStream.Type = 1 '***ポストデータの総バイト数 nByte = Request.TotalBytes '***ポストデータ取得 P_Data = Request.BinaryRead(nByte) '***ファイ名検索文字列の設定 FN_SEARCH = "filename=" '***ファイル名の開始位置を取得 S_LOC = InStrB(P_Data, STR2BIN(FN_SEARCH)) + Len(FN_SEARCH) '***ファイル名の終了位置を取得 E_LOC = InStrB(S_LOC,P_Data, STR2BIN(Chr(13))) - 1 For i = S_LOC + 1 TO E_LOC - 1 If (&h81 <= AscB(MidB(P_Data,i,1)) And _ AscB(MidB(P_Data,i,1)) <= &h9F) Or _ (&hE0 <= AscB(MidB(P_Data,i,1)) And _ AscB(MidB(P_Data,i,1)) <= &hEF) Then SAVE_FN = SAVE_FN & Chr(AscB(MidB(P_Data, i, 1)) * 256 + _ AscB(MidB(P_Data, i + 1, 1))) i = i + 1 Else SAVE_FN = SAVE_FN & Chr(AscB(MidB(P_Data,i,1))) End If Next '***ファイル名の取得 SAVE_FN = Right(SAVE_FN,Len(SAVE_FN) - InstrRev(SAVE_FN,"\")) '***データ開始位置の取得 S_LOC = InStrB(P_Data, STR2BIN(Chr(13))) '***データ文字列の取得 Target = LeftB(P_Data, S_LOC) For i = 0 TO 2 S_LOC = InStrB(S_LOC+1, P_Data, STR2BIN(Chr(13))) Next '***データ終了位置の取得 E_LOC = InStrB(S_LOC+1, P_Data, Target) '***バイナリデータをストリームへ書き込み ObjStream.Write P_Data '***開始位置を指定 ObjStream.Position = S_LOC + 1 '***ストリームの読み取り B_Data = ObjStream.Read(E_LOC - (S_LOC + 2) - 2) '***現在の位置を初期化 ObjStream.Position = 0 '***現在の位置をストリームの終端に設定 ObjStream.SetEOS '***バイナリデータをストリームへ書き込み ObjStream.Write B_Data '***ストリームをファイルへ保存(上書き) ObjStream.SaveToFile Server.MapPath(SAVE_FN),2 ObjStream.Close
Set ObjStream = Nothing End If '***文字列をバイナリ変換する関数 Function STR2BIN(strData) Dim i For i = 1 To Len(strData) STR2BIN = STR2BIN & ChrB(AscB(Mid(strData, i, 1))) Next End Function %> </body></html> |