Scripting‎ > ‎

File Upload(ASP)

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>