﻿<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<%
dim oUpFileStream

Class Upload_file

dim Form,File,Err

Private Sub Class_Initialize
	   Err=-1
end sub

Private Sub Class_Terminate 
'清除變數及對像
	if Err < 0 then
		oUpFileStream.Close
		Form.RemoveAll
		File.RemoveAll
		set Form=nothing
		set File=nothing
		set oUpFileStream =nothing
	end if
End Sub

Public Sub GetDate(RetSize)
'定義變數
	dim RequestBinDate,sStart,bCrLf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,oFileInfo
	dim iFileSize,sFilePath,sFileType,sFormvalue,sFileName
	dim iFindStart,iFindEnd
	dim iFormStart,iFormEnd,sFormName
'代碼開始
	If Request.TotalBytes < 1 Then
		Err=1
		Exit Sub
	End If
	If RetSize > 0 Then 
		If Request.TotalBytes > RetSize then
			Err=2
			Exit Sub
		End If
	End If
	set Form = Server.CreateObject("Scripting.Dictionary")
	set File = Server.CreateObject("Scripting.Dictionary")
	set tStream = Server.CreateObject("adodb.stream")
	set oUpFileStream = Server.CreateObject("adodb.stream")
	oUpFileStream.Type = 1
	oUpFileStream.Mode = 3
	oUpFileStream.Open 
	oUpFileStream.Write Request.BinaryRead(Request.TotalBytes)
	oUpFileStream.Position=0
	RequestBinDate = oUpFileStream.Read 
	iFormEnd = oUpFileStream.Size
	bCrLf = chrB(13) & chrB(10)
'取得每個項目之間的分隔符號


	sStart = MidB(RequestBinDate,1, InStrB(1,RequestBinDate,bCrLf)-1)
	iStart = LenB (sStart)
	iFormStart = iStart+2
'分解專案
Do
	iInfoEnd = InStrB(iFormStart,RequestBinDate,bCrLf & bCrLf)+3
	tStream.Type = 1
	tStream.Mode = 3
	tStream.Open
	oUpFileStream.Position = iFormStart
	oUpFileStream.CopyTo tStream,iInfoEnd-iFormStart
	tStream.Position = 0
	tStream.Type = 2
	tStream.Charset ="utf-8"
	sInfo = tStream.ReadText 
	'取得表單專案名稱
	iFormStart = InStrB(iInfoEnd,RequestBinDate,sStart)-1
	iFindStart = InStr(22,sInfo,"name=""",1)+6
	iFindEnd = InStr(iFindStart,sInfo,"""",1)
	sFormName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
	'如果是檔
	if InStr (45,sInfo,"filename=""",1) > 0 then
		set oFileInfo= new FileInfo
		'取得檔屬性
		iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10
		iFindEnd = InStr(iFindStart,sInfo,"""",1)
		sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
		oFileInfo.FileName = GetFileName(sFileName)
		oFileInfo.FilePath = GetFilePath(sFileName)
		oFileInfo.FileExt = GetFileExt(sFileName)
		iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14
		iFindEnd = InStr(iFindStart,sInfo,vbCr)
		oFileInfo.FileType = Mid (sinfo,iFindStart,iFindEnd-iFindStart)
		oFileInfo.FileStart = iInfoEnd
		oFileInfo.FileSize = iFormStart -iInfoEnd -2
		oFileInfo.FormName = sFormName
		file.add sFormName,oFileInfo
	else
		'如果是表單項目
		tStream.Close
		tStream.Type = 1
		tStream.Mode = 3
		tStream.Open
		oUpFileStream.Position = iInfoEnd 
		oUpFileStream.CopyTo tStream,iFormStart-iInfoEnd-2
		tStream.Position = 0
		tStream.Type = 2
		tStream.Charset = "utf-8"
		sFormvalue = tStream.ReadText 
		'response.write sFormValue
		form.Add sFormName,sFormvalue
	end if
		tStream.Close
		iFormStart = iFormStart+iStart+2
		'如果到檔尾了就退出
loop until (iFormStart+2) = iFormEnd 
	RequestBinDate=""
	set tStream = nothing
End Sub

'取得檔路徑
Private function GetFilePath(FullPath)
	If FullPath <> "" Then
		GetFilePath = left(FullPath,InStrRev(FullPath, "\"))
	Else
		GetFilePath = ""
	End If
End function

'取得檔案名
Private function GetFileName(FullPath)
	If FullPath <> "" Then
		GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1)
	Else
		GetFileName = ""
	End If
End function

'取得副檔名
Private function GetFileExt(FullPath)
	If FullPath <> "" Then
		GetFileExt = mid(FullPath,InStrRev(FullPath, ".")+1)
	Else
		GetFileExt = ""
	End If
End function

End Class

'檔屬性類
Class FileInfo
	dim FormName,FileName,FilePath,FileSize,FileType,FileStart,FileExt
	Private Sub Class_Initialize 
		FileName = ""
		FilePath = ""
		FileSize = 0
		FileStart= 0
		FormName = ""
		FileType = ""
		FileExt = ""
	End Sub

'保存檔方法

	Public function SaveToFile(FullPath)
'	response.write fullpath
	'response.end
		dim oFileStream,ErrorChar,i
		SaveToFile=1
		if trim(fullpath)="" or right(fullpath,1)="/" then exit function

		set oFileStream=CreateObject("Adodb.Stream")
		oFileStream.Type=1
		oFileStream.Mode=3
		oFileStream.Open
		oUpFileStream.position=FileStart
		oUpFileStream.copyto oFileStream,FileSize
		oFileStream.SaveToFile FullPath,2
		oFileStream.Close
		set oFileStream=nothing 
		SaveToFile=0
	end function

'取得檔內容
	Public Function GetDate
		oUpFileStream.Position =FileStart
		GetDate=oUpFileStream.Read(FileSize)
	End Function
End Class


'create_unique function use for upload file
Function create_unique()
'generate a random string to create unique file name
randomize
SD_count = 1


DO
'get random number b/w 48 & 122 (0 - Z)
intRnd = int(75 * rnd + 48)

'limit string to 0-9, a-z, A-Z
if (intRnd < 57 OR intRnd > 65) AND (intRnd < 90 OR intRnd > 97) then
     listRnd = listRnd & chr(intRnd)
     SD_count = SD_count + 1
END IF

'make random string 15 chars gives 768,909,704,948,766,668,552,634,368 possible combinations on UNIX (case sensitive) or 221,073,919,720,733,357,899,776 combinations under Windows - should be enough )
LOOP UNTIL SD_count = 16

'make it a little more readable
   create_unique = mid(listRnd,1,5) & "-" & mid(listRnd,6,5) & "-" & mid(listRnd,11,5)


End Function
%>
