<%
'=================
' FileSystemObject
'=================

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'Upload Script Version 1.2
'Copyright © 2004, Yusuf Wiryonoputro. All rights reserved.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server.ScriptTimeout = 7000

Class Upload

  Private nFileCount
  Private dictRequest
  'Private dictRequestFiles(5,6)
  Private dictRequestFiles()

  Private sAllowedTypes
  Private nMaxFileSize
  Private nErrNum
  Private sErrMsg

  Public Sub Recieve()

    nErrNum = 0

    sContentType = Request.ServerVariables("HTTP_CONTENT_TYPE")
    if InStr(sContentType,"multipart/form-data")=0 Then
      nErrNum = 1
      sErrMsg = "Form enctype is not multipart/form-data"
      Exit Sub
    End If

    binData = Request.BinaryRead(Request.TotalBytes) '1
    if Request.Totalbytes > nMaxFileSize then
      nErrNum = 2
      sErrMsg = "The posted data exceeds the maximum size allowed."
'     Exit Sub
    End If
    'binData = Request.BinaryRead(Request.TotalBytes) '2

    'Kalau 1 enable => tdk error
    'Kalau 1 disable, 2 enable => error

    lenBinData = lenB(binData)
    set adoRs = server.CreateObject("ADODB.Recordset")
    If lenBinData>0 Then
      adoRs.Fields.Append "UploadData", 201, lenBinData
      adoRs.Open
      adoRs.AddNew
      adoRs("UploadData").AppendChunk binData
      adoRs.Update
      sData = adoRs("UploadData")'Char
    End If

    arrTemp = split(sContentType,";")
    sBoundary = Split(Trim(arrTemp(1)), "=")(1)
    arrFieldValue = Split(sData,sBoundary)

    set dictRequest = server.CreateObject("Scripting.Dictionary")
    sBrowser = UCase(Request.ServerVariables("HTTP_USER_AGENT"))

    nFileCount=0
    For i=0 To UBound(arrFieldValue)
      fieldSeparate = InStr(arrFieldValue(i), Chr(13) & Chr(10) & Chr(13) & Chr(10))
      If fieldSeparate>0 Then
        fieldEnd  = fieldSeparate-3
        valueStart  = fieldSeparate+4
        valueEnd  = Len(arrFieldValue(i)) - fieldSeparate - 4 - 3

        sFieldRaw = Mid(arrFieldValue(i), 3 , fieldEnd)
        sValue    = Mid(arrFieldValue(i), valueStart , valueEnd)

        If InStr(sFieldRaw,"filename=")>0 Then

          sLocal = getLocal(sFieldRaw)
          If InStr(sBrowser,"WIN")>0 Then
            posStart = InStrRev(sLocal, "\") + 1
            sFileName = Mid(sLocal, posStart)
          End If
          If InStr(sBrowser,"MAC")>0 Then
            sFileName = sLocal
          End If

          ReDim dictRequestFiles(5,6)
          dictRequestFiles(nFileCount,0) = getFieldName(sFieldRaw)
          dictRequestFiles(nFileCount,1) = sFileName
          dictRequestFiles(nFileCount,2) = sValue 'or File Data
          dictRequestFiles(nFileCount,3) = sLocal
          dictRequestFiles(nFileCount,4) = getFileType(sFieldRaw)
          dictRequestFiles(nFileCount,5) = IsAllowed(sFileName)

          nFileCount=nFileCount+1
        Else
          dictRequest.Add getFieldName(sFieldRaw),sValue
        End If
      End If
    Next
  End Sub

  '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ' PRIVATE
  '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Private Function getFieldName(s)
    posStart = InStr(s, "name=") + 6 '6 krn ada tambahan "
    if InStr(s,Chr(34) & ";")>0 Then 'Chr(34) = "
      's => Content-Disposition: form-data; name="File1"; filename="C:\Documents and Settings\Ys\My Documents\mytext.txt"
      '   Content-Type: text/plain
      posEnd = InStr( posStart , s, Chr(34) & ";" )
    Else
      's => Content-Disposition: form-data; name="inpNewFileName"
      posEnd = inStr( posStart , s, Chr(34))
    End If
    getFieldName = Mid(s, posStart , posEnd - posStart)
  End Function

  Private Function getLocal(s)
    posStart = InStr(s, "filename=") + 10
    posEnd = InStr(s, Chr(34) & Chr(13) & Chr(10))
    getLocal = Mid(s, posStart, posEnd-posStart)
  End Function

  Private Function getFileType(s)
    posStart = InStr(s, "Content-Type: ")
    GetFileType = Mid(s, posStart + 14)
  End Function

  Private Function IsAllowed(sFileName)
    For Each Item In Split(sFileName,".")
      sExtention = Item
    Next

    IsAllowed = false
    For Each Item In Split(sAllowedTypes,"|")
      If LCase(Item) = LCase(sExtention) or LCase(Item) = "*"  Then
        IsAllowed = true
      End If
    Next
  End Function

  '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ' PUBLIC
  '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Public Property Let AllowedTypes(sVal)
    sAllowedTypes = sVal
  End Property

  Public Property Let MaxFileSize(nVal)
    nMaxFileSize = nVal
  End Property

  Public Property Get ErrNum
    ErrNum = nErrNum
  End Property

  Public Property Get ErrMsg
    ErrMsg = sErrMsg
  End Property
  '~~~~~~~~~~~~

  Public Function RequestValue(s)
    For i=0 To nFileCount 'untuk file
      if dictRequestFiles(i,0) = s Then
        RequestValue = dictRequestFiles(i,1)
        exit function
      End If
    Next
    RequestValue = dictRequest(s) 'utk selain file
  End Function

  Public Function RequestFileContent(s)
    if Len(CStr(nFileCount)) = 0 then
      RequestFileContent = null
      exit function
    End If
    For i=0 To nFileCount
      if dictRequestFiles(i,0) = s Then

        RequestFileContent = dictRequestFiles(i,2)
        exit function
      End If
    Next
    RequestFileContent = null
  End Function

  Public Function RequestFileStatus(s)
    if Len(CStr(nFileCount)) = 0 then
      RequestFileStatus = null
      exit function
    End If
    For i=0 To nFileCount
      if dictRequestFiles(i,0) = s Then
        RequestFileStatus = dictRequestFiles(i,5)
        exit function
      End If
    Next
  End Function

  Public Function RequestFileType(s)
    if Len(CStr(nFileCount)) = 0 then
      RequestFileType = null
      exit function
    End If
    For i=0 To nFileCount
      if dictRequestFiles(i,0) = s Then

        RequestFileType = dictRequestFiles(i,4)
        exit function
      End If
    Next
    RequestFileType = null
  End Function

  Public Function SaveFile(sPath,sContent)
    Set fso = server.CreateObject("Scripting.FileSystemObject")
    Set sFile = fso.CreateTextFile(sPath, True) 'Hati2
    sFile.Write(sContent)
    sFile.Close
    Set fso = Nothing
  End Function

End Class
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'above: Upload Script Version 1.2
'Copyright © 2003, Yusuf Wiryonoputro. All rights reserved.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dim sUploadedFile
sUploadedFile=""

set oFSO = server.CreateObject ("Scripting.FileSystemObject")

Set oUpload = New Upload
oUpload.AllowedTypes = "gif|jpg|png|wma|wmv|swf|doc|zip|pdf|txt"
'oUpload.AllowedTypes = "*" 'Accept all file types
oUpload.MaxFileSize = 3000000
oUpload.Recieve()

If oUpload.ErrNum=1 Then 'DEFAULT (Form enctype is not multipart/form-data)
  ffilter=request("ffilter")'ffilter

  if(Len(CStr(request("inpCurrFolder")))=0) then
    currFolder = server.MapPath(arrBaseFolder(0)) 'opened folder (Physical)
  else
    currFolder = request("inpCurrFolder") 'opened folder (Physical)
  end if

  if(Len(CStr(request("inpFileToDelete")))<>0) then 'Delete File
    Set oFile = oFSO.GetFile(Server.MapPath(CStr(request("inpFileToDelete"))))
    oFile.Delete
  end if
  sMsg = ""
Else
  ffilter=oUpload.RequestValue("inpFilter")'ffilter

  'UPLOAD PROCESS HERE
  if(Len(CStr(oUpload.RequestValue("inpCurrFolder2")))=0) then
    currFolder = server.MapPath(arrBaseFolder(0)) 'opened folder (Physical)
  else
    currFolder = oUpload.RequestValue("inpCurrFolder2") 'opened folder (Physical)
  end if

  If oUpload.ErrNum=0 Then
    If oUpload.RequestFileStatus("File1") Then
        sPath = currFolder & "\" & oUpload.RequestValue("File1")
        sContent = oUpload.RequestFileContent("File1")
        oUpload.SaveFile sPath,sContent

        sUploadedFile=mid(sPath,InStrRev(sPath,"\")+1)'uploaded file
    Else
        sMsg = "The File Type is not allowed."
    End If
  Else 'Ex. "The posted data exceeds the maximum size allowed."
    sMsg = oUpload.ErrMsg
  End If

End If
Set oUpload = Nothing

%>
