561 lines
15 KiB
Plaintext
561 lines
15 KiB
Plaintext
<%
|
||
'=========================================================
|
||
'类名: AnUpLoad(艾恩无组件上传类)
|
||
'作者: Anlige
|
||
'版本: 艾恩ASP无组件上传类V11.03.25
|
||
'开发日期: 2008-4-12
|
||
'修改日期: 2011-03025
|
||
'主页: http://dev.mo.cn
|
||
'Email: zhanghuiguoanlige@126.com
|
||
'QQ: 1034555083
|
||
'=========================================================
|
||
Dim StreamT
|
||
Class AnUpLoad
|
||
Private Form, Fils
|
||
Private vCharSet, vMaxSize, vSingleSize, vErr, vVersion, vTotalSize, vExe, pID, vOP, vErrExe,vboundary, vLostTime, vMode, vFileCount
|
||
|
||
'==============================
|
||
'设置和读取属性开始
|
||
'==============================
|
||
Public Property Let Mode(ByVal value)
|
||
vMode = value
|
||
End Property
|
||
|
||
Public Property Let MaxSize(ByVal value)
|
||
vMaxSize = value
|
||
End Property
|
||
|
||
Public Property Let SingleSize(ByVal value)
|
||
vSingleSize = value
|
||
End Property
|
||
|
||
Public Property Let Exe(ByVal value)
|
||
vExe = LCase(value)
|
||
End Property
|
||
|
||
Public Property Let CharSet(ByVal value)
|
||
vCharSet = value
|
||
End Property
|
||
|
||
Public Property Get ErrorID()
|
||
ErrorID = vErr
|
||
End Property
|
||
|
||
Public Property Get FileCount()
|
||
FileCount = Fils.count
|
||
End Property
|
||
|
||
Public Property Get Description()
|
||
Description = GetErr(vErr)
|
||
End Property
|
||
|
||
Public Property Get Version()
|
||
Version = vVersion
|
||
End Property
|
||
|
||
Public Property Get TotalSize()
|
||
TotalSize = vTotalSize
|
||
End Property
|
||
|
||
Public Property Get ProcessID()
|
||
ProcessID = pID
|
||
End Property
|
||
|
||
Public Property Let openProcesser(ByVal value)
|
||
vOP = value
|
||
End Property
|
||
|
||
Public Property Get LostTime()
|
||
LostTime = vLostTime
|
||
End Property
|
||
'==============================
|
||
'设置和读取属性结束,初始化类
|
||
'==============================
|
||
|
||
Private Sub Class_Initialize()
|
||
set Form = server.createobject("Scripting.Dictionary")
|
||
set Fils = server.createobject("Scripting.Dictionary")
|
||
Set StreamT = server.CreateObject("Adodb.stream")
|
||
vVersion = "艾恩ASP无组件上传类V10.10.22"
|
||
vMaxSize = -1
|
||
vSingleSize = -1
|
||
vErr = -1
|
||
vExe = ""
|
||
vTotalSize = 0
|
||
vCharSet = "utf-8"
|
||
vOP=false
|
||
pID="AnUpload"
|
||
setApp "",0,0,""
|
||
vMode = 0
|
||
End Sub
|
||
|
||
Private Sub Class_Terminate()
|
||
Dim f
|
||
Form.RemoveAll()
|
||
For each f in Fils
|
||
Fils(f).value=empty
|
||
Set Fils(f) = Nothing
|
||
Next
|
||
Fils.RemoveAll()
|
||
Set Form = Nothing
|
||
Set Fils = Nothing
|
||
StreamT.Close()
|
||
Set StreamT = Nothing
|
||
End Sub
|
||
|
||
'==============================
|
||
'函数名:GetData
|
||
'作用:处理客户端提交来的所有数据
|
||
'==============================
|
||
Public Sub GetData()
|
||
Dim time1
|
||
time1 = timer()
|
||
if vOP And trim(request.querystring("processid"))<>"" then pID=request.querystring("processid")
|
||
Dim value, str, bcrlf, fpos, sSplit, slen, istart,ef
|
||
Dim TotalBytes,tempdata,BytesRead,ChunkReadSize,PartSize,DataPart,formend, formhead, startpos, endpos, formname, FileName, fileExe, valueend, NewName,localname,type_1,contentType
|
||
TotalBytes = Request.TotalBytes
|
||
ef = false
|
||
If checkEntryType = false Then ef = true : vErr = 2
|
||
'下面3句注释掉了,因为在IIS5.0中,如果上传大小大于限制大小的文件,会出错,一直没找到解决方法。如果是在IIS5以上的版本使用,可以取消下面3句的注释
|
||
'If Not ef Then
|
||
'If vMaxSize > 0 And TotalBytes > vMaxSize Then ef = true : vErr = 1
|
||
'End If
|
||
If ef Then Exit Sub
|
||
If vMode = 0 Then
|
||
vTotalSize = 0
|
||
StreamT.Type = 1
|
||
StreamT.Mode = 3
|
||
StreamT.Open
|
||
BytesRead = 0
|
||
ChunkReadSize = 1024 * 16
|
||
Do While BytesRead < TotalBytes
|
||
PartSize = ChunkReadSize
|
||
If PartSize + BytesRead > TotalBytes Then PartSize = TotalBytes - BytesRead
|
||
DataPart = Request.BinaryRead(PartSize)
|
||
StreamT.Write DataPart
|
||
BytesRead = BytesRead + PartSize
|
||
setApp "uploading",TotalBytes,BytesRead,""
|
||
Loop
|
||
setApp "uploaded",TotalBytes,BytesRead,""
|
||
StreamT.Position = 0
|
||
tempdata = StreamT.Read
|
||
Else
|
||
tempdata = Request.BinaryRead(TotalBytes)
|
||
End If
|
||
bcrlf = ChrB(13) & ChrB(10)
|
||
fpos = InStrB(1, tempdata, bcrlf)
|
||
sSplit = MidB(tempdata, 1, fpos - 1)
|
||
slen = LenB(sSplit)
|
||
istart = slen + 2
|
||
Do
|
||
formend = InStrB(istart, tempdata, bcrlf & bcrlf)
|
||
formhead = MidB(tempdata, istart, formend - istart)
|
||
str = Bytes2Str(formhead)
|
||
startpos = InStr(str, "name=""") + 6
|
||
endpos = InStr(startpos, str, """")
|
||
formname = LCase(Mid(str, startpos, endpos - startpos))
|
||
valueend = InStrB(formend + 3, tempdata, sSplit)
|
||
If InStr(str, "filename=""") > 0 Then
|
||
startpos = InStr(str, "filename=""") + 10
|
||
endpos = InStr(startpos, str, """")
|
||
type_1=instr(endpos,lcase(str),"content-type")
|
||
contentType=trim(mid(str,type_1+13))
|
||
FileName = Mid(str, startpos, endpos - startpos)
|
||
If Trim(FileName) <> "" Then
|
||
LocalName = FileName
|
||
FileName = Replace(FileName, "/", "\")
|
||
FileName = Mid(FileName, InStrRev(FileName, "\") + 1)
|
||
If instr(FileName,".")>0 Then
|
||
fileExe = Split(FileName, ".")(UBound(Split(FileName, ".")))
|
||
else
|
||
fileExe = ""
|
||
End If
|
||
If vExe <> "" Then '判断扩展名
|
||
If checkExe(fileExe) = True Then
|
||
vErr = 3
|
||
vErrExe = fileExe
|
||
tempdata = empty
|
||
Exit Sub
|
||
End If
|
||
End If
|
||
NewName = Getname()
|
||
NewName = NewName & "." & fileExe
|
||
vTotalSize = vTotalSize + valueend - formend - 6
|
||
If vSingleSize > 0 And (valueend - formend - 6) > vSingleSize Then '判断上传单个文件大小
|
||
vErr = 5
|
||
tempdata = empty
|
||
Exit Sub
|
||
End If
|
||
If vMaxSize > 0 And vTotalSize > vMaxSize Then '判断上传数据总大小
|
||
vErr = 1
|
||
tempdata = empty
|
||
Exit Sub
|
||
End If
|
||
If Fils.Exists(formname) Then
|
||
vErr = 4
|
||
tempdata = empty
|
||
Exit Sub
|
||
Else
|
||
Dim fileCls:set fileCls= new UploadFileEx
|
||
fileCls.ContentType=contentType
|
||
fileCls.Size = (valueend - formend - 6)
|
||
fileCls.Position = (formend + 3)
|
||
fileCls.FormName = formname
|
||
fileCls.NewName = NewName
|
||
fileCls.FileName = FileName
|
||
fileCls.LocalName = FileName
|
||
fileCls.extend=split(NewName,".")(ubound(split(NewName,".")))
|
||
Fils.Add formname, fileCls
|
||
Set fileCls = Nothing
|
||
End If
|
||
End If
|
||
Else
|
||
value = MidB(tempdata, formend + 4, valueend - formend - 6)
|
||
If Form.Exists(formname) Then
|
||
Form(formname) = Form(formname) & "," & Bytes2Str(value)
|
||
Else
|
||
Form.Add formname, Bytes2Str(value)
|
||
End If
|
||
End If
|
||
istart = valueend + 2 + slen
|
||
Loop Until (istart + 2) >= LenB(tempdata)
|
||
vErr = 0
|
||
tempdata = empty
|
||
vLostTime = FormatNumber((timer-time1)*1000,2)
|
||
End Sub
|
||
|
||
Public sub setApp(stp,total,current,desc)
|
||
Application.lock()
|
||
Application(pID)="{ID:""" & pID & """,step:""" & stp & """,total:" & total & ",now:" & current & ",description:""" & desc & """,dt:""" & now() & """}"
|
||
Application.unlock()
|
||
end sub
|
||
'==============================
|
||
'判断扩展名
|
||
'==============================
|
||
Private Function checkExe(ByVal ex)
|
||
Dim notIn: notIn = True
|
||
If vExe="*" then
|
||
notIn=false
|
||
elseIf InStr(1, vExe, "|") > 0 Then
|
||
Dim tempExe: tempExe = Split(vExe, "|")
|
||
Dim I: I = 0
|
||
For I = 0 To UBound(tempExe)
|
||
If LCase(ex) = tempExe(I) Then
|
||
notIn = False
|
||
Exit For
|
||
End If
|
||
Next
|
||
Else
|
||
If vExe = LCase(ex) Then
|
||
notIn = False
|
||
End If
|
||
End If
|
||
checkExe = notIn
|
||
End Function
|
||
|
||
'==============================
|
||
'把数字转换为文件大小显示方式
|
||
'==============================
|
||
Public Function GetSize(ByVal Size)
|
||
If Size < 1024 Then
|
||
GetSize = FormatNumber(Size, 2) & "B"
|
||
ElseIf Size >= 1024 And Size < 1048576 Then
|
||
GetSize = FormatNumber(Size / 1024, 2) & "KB"
|
||
ElseIf Size >= 1048576 Then
|
||
GetSize = FormatNumber((Size / 1024) / 1024, 2) & "MB"
|
||
End If
|
||
End Function
|
||
|
||
'==============================
|
||
'二进制数据转换为字符
|
||
'==============================
|
||
Private Function Bytes2Str(ByVal byt)
|
||
If LenB(byt) = 0 Then
|
||
Bytes2Str = ""
|
||
Exit Function
|
||
End If
|
||
Dim mystream, bstr
|
||
Set mystream =server.createobject("ADODB.Stream")
|
||
mystream.Type = 2
|
||
mystream.Mode = 3
|
||
mystream.Open
|
||
mystream.WriteText byt
|
||
mystream.Position = 0
|
||
mystream.CharSet = vCharSet
|
||
mystream.Position = 2
|
||
bstr = mystream.ReadText()
|
||
mystream.Close
|
||
Set mystream = Nothing
|
||
Bytes2Str = bstr
|
||
End Function
|
||
|
||
'==============================
|
||
'获取错误描述
|
||
'==============================
|
||
Private Function GetErr(ByVal Num)
|
||
Select Case Num
|
||
Case 0
|
||
GetErr = "数据处理完毕!"
|
||
Case 1
|
||
GetErr = "上传数据超过" & GetSize(vMaxSize) & "限制!可设置MaxSize属性来改变限制!"
|
||
Case 2
|
||
GetErr = "未设置上传表单enctype属性为multipart/form-data或者未设置method属性为Post,上传无效!"
|
||
Case 3
|
||
GetErr = "含有非法扩展名(" & vErrExe & ")文件!只能上传扩展名为" & Replace(vExe, "|", ",") & "的文件"
|
||
Case 4
|
||
GetErr = "对不起,程序不允许使用相同name属性的文件域!"
|
||
Case 5
|
||
GetErr = "单个文件大小超出" & GetSize(vSingleSize) & "的上传限制!"
|
||
End Select
|
||
End Function
|
||
|
||
'==============================
|
||
'根据日期生成随机文件名
|
||
'==============================
|
||
Private Function Getname()
|
||
Dim y, m, d, h, mm, S, r
|
||
Randomize
|
||
y = Year(Now)
|
||
m = right("0" & Month(Now),2)
|
||
d = right("0" & Day(Now),2)
|
||
h = right("0" & Hour(Now),2)
|
||
mm =right("0" & Minute(Now),2)
|
||
S = right("0" & Second(Now),2)
|
||
r = 0
|
||
r = CInt(Rnd() * 10000)
|
||
S = right("0000" & r,4)
|
||
Getname = y & m & d & h & mm & S & r
|
||
End Function
|
||
|
||
'==============================
|
||
'检测上传类型是否为multipart/form-data
|
||
'==============================
|
||
Private Function checkEntryType()
|
||
Dim ContentType, ctArray, bArray,RequestMethod
|
||
RequestMethod=trim(LCase(Request.ServerVariables("REQUEST_METHOD")))
|
||
if RequestMethod="" or RequestMethod<>"post" then
|
||
checkEntryType = False
|
||
exit function
|
||
end if
|
||
ContentType = LCase(Request.ServerVariables("HTTP_CONTENT_TYPE"))
|
||
ctArray = Split(ContentType, ";")
|
||
if ubound(ctarray)>=0 then
|
||
If Trim(ctArray(0)) = "multipart/form-data" Then
|
||
checkEntryType = True
|
||
vboundary = Split(ContentType,"boundary=")(1)
|
||
Else
|
||
checkEntryType = False
|
||
End If
|
||
else
|
||
checkEntryType = False
|
||
end if
|
||
End Function
|
||
|
||
'==============================
|
||
'获取上传表单值,参数可选,如果为-1则返回一个包含所有表单项的一个dictionary对象
|
||
'==============================
|
||
Public Function Forms(ByVal formname)
|
||
If trim(formname) = "-1" Then
|
||
Set Forms = Form
|
||
Else
|
||
If Form.Exists(LCase(formname)) Then
|
||
Forms = Form(LCase(formname))
|
||
Else
|
||
Forms = ""
|
||
End If
|
||
End If
|
||
End Function
|
||
|
||
'==============================
|
||
'获取上传的文件类,参数可选,如果为-1则返回一个包含所有上传文件类的一个dictionary对象
|
||
'==============================
|
||
Public Function Files(ByVal formname)
|
||
If trim(formname) = "-1" Then
|
||
Set Files = Fils
|
||
Else
|
||
If Fils.Exists(LCase(formname)) Then
|
||
Set Files = Fils(LCase(formname))
|
||
Else
|
||
Set Files = Nothing
|
||
End If
|
||
End If
|
||
End Function
|
||
End Class
|
||
|
||
Class UploadFileEx
|
||
Private mvarFormName , mvarNewName , mvarLocalName , mvarFileName , mvarUserSetName , mvarContentType ,mException,mvarPosition
|
||
Private mvarSize , mvarValue , mvarPath , mvarExtend ,mvarWidth, mvarHeight
|
||
|
||
Public Property Let Extend(ByVal vData )
|
||
mvarExtend = vData
|
||
End Property
|
||
Public Property Get Extend()
|
||
Extend = mvarExtend
|
||
End Property
|
||
|
||
Public Property Get Width()
|
||
Width = mvarWidth
|
||
End Property
|
||
|
||
Public Property Get Height()
|
||
Height = mvarHeight
|
||
End Property
|
||
|
||
|
||
Public Property Let Path(ByVal vData )
|
||
mvarPath = vData
|
||
End Property
|
||
Public Property Get Path()
|
||
Path = mvarPath
|
||
End Property
|
||
|
||
Public Property Get Exception()
|
||
Exception = mException
|
||
End Property
|
||
|
||
Public Property Let Value(ByVal vData )
|
||
mvarValue = vData
|
||
End Property
|
||
|
||
Public Property Get Value()
|
||
Value = mvarValue
|
||
End Property
|
||
|
||
Public Property Let Size(ByVal vData )
|
||
mvarSize = vData
|
||
End Property
|
||
Public Property Get Size()
|
||
Size = mvarSize
|
||
End Property
|
||
|
||
Public Property Let Position(ByVal vData )
|
||
mvarPosition = vData
|
||
End Property
|
||
Public Property Get Position()
|
||
Size = mvarPosition
|
||
End Property
|
||
|
||
Public Property Let ContentType(ByVal vData )
|
||
mvarContentType = vData
|
||
End Property
|
||
Public Property Get ContentType()
|
||
ContentType = mvarContentType
|
||
End Property
|
||
|
||
Public Property Let UserSetName(ByVal vData )
|
||
mvarUserSetName = vData
|
||
End Property
|
||
Public Property Get UserSetName()
|
||
UserSetName = mvarUserSetName
|
||
End Property
|
||
|
||
Public Property Let FileName(ByVal vData )
|
||
mvarFileName = vData
|
||
End Property
|
||
Public Property Get FileName()
|
||
FileName = mvarFileName
|
||
End Property
|
||
|
||
Public Property Let LocalName(ByVal vData )
|
||
mvarLocalName = vData
|
||
End Property
|
||
Public Property Get LocalName()
|
||
LocalName = mvarLocalName
|
||
End Property
|
||
|
||
Public Property Let NewName(ByVal vData )
|
||
mvarNewName = vData
|
||
End Property
|
||
Public Property Get NewName()
|
||
NewName = mvarNewName
|
||
End Property
|
||
|
||
Public Property Let FormName(ByVal vData )
|
||
mvarFormName = vData
|
||
End Property
|
||
Public Property Get FormName()
|
||
FormName = mvarFormName
|
||
End Property
|
||
|
||
Private Sub Class_Initialize()
|
||
mvarSize =0
|
||
mvarWidth = 0
|
||
mvarHeight = 0
|
||
End Sub
|
||
|
||
Public Function SaveToFile(ByVal Path , byval tOption, byval OverWrite)
|
||
On Error Resume Next
|
||
Dim IsP
|
||
IsP = (InStr(Path, ":") = 2)
|
||
If Not IsP Then Path = Server.MapPath(Path)
|
||
Path = Replace(Path, "/", "\")
|
||
If Mid(Path, Len(Path) - 1) <> "\" Then Path = Path + "\"
|
||
CreateFolder Path
|
||
mvarPath = Path
|
||
If tOption = 1 Then
|
||
Path = Path & mvarLocalName: mvarFileName = mvarLocalName
|
||
Else
|
||
If tOption = -1 And mvarUserSetName <> "" Then
|
||
Path = Path & mvarUserSetName & "." & mvarExtend: mvarFileName = mvarUserSetName & "." & mvarExtend
|
||
Else
|
||
Path = Path & mvarNewName: mvarFileName = mvarNewName
|
||
End If
|
||
End If
|
||
If Not OverWrite Then
|
||
Path = GetFilePath()
|
||
End If
|
||
Dim tmpStrm
|
||
Set tmpStrm =server.CreateObject("ADODB.Stream")
|
||
tmpStrm.Mode = 3
|
||
tmpStrm.Type = 1
|
||
tmpStrm.Open
|
||
StreamT.Position = mvarPosition
|
||
StreamT.copyto tmpStrm,mvarSize
|
||
tmpStrm.SaveToFile Path, 2
|
||
tmpStrm.Close
|
||
Set tmpStrm = Nothing
|
||
If Not Err Then
|
||
Set SaveToFile = objFromJson("{error:false}")
|
||
Else
|
||
Set SaveToFile = objFromJson("{error:true,description:'" & replace(Err.Description,"'","\'") & "'}")
|
||
mException=Err.Description
|
||
End If
|
||
End Function
|
||
|
||
Public Function GetBytes()
|
||
StreamT.Position = mvarPosition
|
||
GetBytes = StreamT.read(mvarSize)
|
||
End Function
|
||
Private Function CreateFolder(ByVal folderPath )
|
||
Dim oFSO
|
||
Set oFSO = server.CreateObject("Scripting.FileSystemObject")
|
||
Dim sParent
|
||
sParent = oFSO.GetParentFolderName(folderPath)
|
||
If sParent = "" Then Exit Function
|
||
If Not oFSO.FolderExists(sParent) Then CreateFolder (sParent)
|
||
If Not oFSO.FolderExists(folderPath) Then oFSO.CreateFolder (folderPath)
|
||
Set oFSO = Nothing
|
||
End Function
|
||
|
||
Private Function GetFilePath()
|
||
Dim oFSO, Fname , FNameL , i
|
||
i = 0
|
||
Set oFSO = server.CreateObject("Scripting.FileSystemObject")
|
||
Fname = mvarPath & mvarFileName
|
||
FNameL = Mid(mvarFileName, 1, InStr(mvarFileName, ".") - 1)
|
||
Do While oFSO.FileExists(Fname)
|
||
Fname = mvarPath & FNameL & "(" & i & ")." & mvarExtend
|
||
mvarFileName = FNameL & "(" & i & ")." & mvarExtend
|
||
i = i + 1
|
||
Loop
|
||
Set oFSO = Nothing
|
||
GetFilePath = Fname
|
||
End Function
|
||
End Class
|
||
%>
|
||
<script language="jscript" runat="server">
|
||
function objFromJson(str){
|
||
eval("var _temp=(" + str + ");");
|
||
return _temp;
|
||
}
|
||
</script> |