<%
Class FileUploader
	Public  Files
	Public  FormElem
	Public  filename
	Private Sub Class_Initialize()
		Set Files = Server.CreateObject("Scripting.Dictionary")
		Set FormElem = Server.CreateObject("Scripting.Dictionary")
	End Sub
	Private Sub Class_Terminate()
		If IsObject(Files) Then
			Files.RemoveAll()
			Set Files = Nothing
		End If
		If IsObject(FormElem) Then
			FormElem.RemoveAll()
			Set FormElem = Nothing
		End If
	End Sub
	Public Property Get Form(sIndex)
		Form = ""
		If FormElem.Exists(LCase(sIndex)) Then Form = FormElem.Item(LCase(sIndex))
	End Property
	Public Default Sub Upload()
		Dim biData, sInputName
		Dim nPosBegin, nPosEnd, nPos, vDataBounds, nDataBoundPos
		Dim nPosFile, nPosBound
		
		biData = Request.BinaryRead(Request.TotalBytes)
		nPosBegin = 1
		nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13)))
		
		If (nPosEnd-nPosBegin) <= 0 Then Exit Sub
		 
		vDataBounds = MidB(biData, nPosBegin, nPosEnd-nPosBegin)
		nDataBoundPos = InstrB(1, biData, vDataBounds)
		
		Do Until nDataBoundPos = InstrB(biData, vDataBounds & CByteString("--"))
			
			nPos = InstrB(nDataBoundPos, biData, CByteString("Content-Disposition"))
			nPos = InstrB(nPos, biData, CByteString("name="))
			nPosBegin = nPos + 6
			nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(34)))
			sInputName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
			nPosFile = InstrB(nDataBoundPos, biData, CByteString("filename="))
			nPosBound = InstrB(nPosEnd, biData, vDataBounds)
			
			If nPosFile <> 0 And  nPosFile < nPosBound Then
				Dim oUploadFile, sFileName
				Set oUploadFile = New UploadedFile
				
				nPosBegin = nPosFile + 10
				nPosEnd =  InstrB(nPosBegin, biData, CByteString(Chr(34)))
				sFileName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
				oUploadFile.FileName = Right(sFileName, Len(sFileName)-InStrRev(sFileName, "\"))
				
				'*************************************************
				' SETEO EL NOMBRE DE LA IMAGEN
				filename = Right(sFileName, Len(sFileName)-InStrRev(sFileName, "\"))
				'*************************************************
				nPos = InstrB(nPosEnd, biData, CByteString("Content-Type:"))
				nPosBegin = nPos + 14
				nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13)))
				
				oUploadFile.ContentType = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
				
				nPosBegin = nPosEnd+4
				nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2
				oUploadFile.FileData = MidB(biData, nPosBegin, nPosEnd-nPosBegin)
				
				If oUploadFile.FileSize > 0 Then 
					If Files.Exists(sInputName) Then
						If IsArray(Files.Item(LCase(sInputName))) Then
							tmpArrFiles = Files.Item(LCase(sInputName))
							tmpElem = UBound(tmpArrFiles)+1
							Redim Preserve tmpArrFiles(tmpElem)
							Set tmpArrFiles(tmpElem-1) = oUploadFile
							Files.Remove LCase(sInputName)
							Files.Add LCase(sInputName) , tmpArrFiles
						Else
							Dim arrFilesSameFieldName(2)
							Set tmpFile = Files.Item(LCase(sInputName))
							Set arrFilesSameFieldName(0) = tmpFile
							Set arrFilesSameFieldName(1) = oUploadFile
							Files.Remove LCase(sInputName)
							Files.Add LCase(sInputName) , arrFilesSameFieldName
						End If
					Else
						Files.Add LCase(sInputName), oUploadFile
					End If
				End If
			Else
				nPos = InstrB(nPos, biData, CByteString(Chr(13)))
				nPosBegin = nPos + 4
				nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2
				
				If Not FormElem.Exists(LCase(sInputName)) Then 
					FormElem.Add LCase(sInputName), CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
				Else
					If TypeName(FormElem.Item(sInputName)) = "Dictionary" Then
						FormElem.Item(sInputName).Add (FormElem.Item(sInputName).Count + 1), CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
					Else
						Dim newColecc
						Set newColecc = Server.CreateObject("Scripting.Dictionary")
						newColecc.Add 1 , FormElem.Item(sInputName) 
						newColecc.Add 2 , CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))
						FormElem.Remove LCase(sInputName)
						FormElem.Add LCase(sInputName), newColecc
					End If
					
				End If
			End If

			nDataBoundPos = InstrB(nDataBoundPos + LenB(vDataBounds), biData, vDataBounds)
		Loop
	End Sub

	'String to byte string conversion
	Private Function CByteString(sString)
		Dim nIndex
		For nIndex = 1 to Len(sString)
		   CByteString = CByteString & ChrB(AscB(Mid(sString,nIndex,1)))
		Next
	End Function

	'Byte string to string conversion
	Private Function CWideString(bsString)
		Dim nIndex
		CWideString =""
		For nIndex = 1 to LenB(bsString)
		   CWideString = CWideString & Chr(AscB(MidB(bsString,nIndex,1))) 
		Next
	End Function
End Class

Class UploadedFile
	Public ContentType
	Public FileName
	Public FileData
	
	Public Property Get FileSize()
		FileSize = LenB(FileData)
	End Property

	Public Sub SaveToDisk(sPath, nombre_archivo)
		Dim oFS, oFile
		Dim nIndex
		
		
		If sPath = "" Or FileName = "" Then Exit Sub
		
		sPath = Server.MapPAth(sPath)
		
		If Mid(sPath, Len(sPath), 1) <> "\" Then sPath = sPath & "\"
		
		Set oFS = Server.CreateObject("Scripting.FileSystemObject")
		
		If Not oFS.FolderExists(sPath) Then Exit Sub
		Set oFile = oFS.CreateTextFile(sPath & nombre_archivo, True)
		'Response.Write(vbcrlf & sPath & nombre_archivo & vbcrlf)
		
		For nIndex = 1 to LenB(FileData)
		    oFile.Write Chr(AscB(MidB(FileData,nIndex,1)))
		Next
		oFile.Close
	End Sub
	
	Public Sub SaveToDatabase(ByRef oField)
		If LenB(FileData) = 0 Then Exit Sub
		
		If IsObject(oField) Then
			oField.AppendChunk FileData
		End If
	End Sub
End Class
%>