动态|上传|网页
<%
Class Upload
Public Form, Finished
Private bVBCrlf, bSeparate, formData, cFields, folderPath, itemCount, sErrors, sAuthor, sVersion
Private itemStart(), itemLength(), dataStart(), dataLength(), itemName(), itemData(), extenArr()
Private Sub Class_Initialize
formData = Request.BinaryRead(Request.TotalBytes)
Set Form = Server.CreateObject("Scripting.Dictionary")
sAuthor = "51JS.COM-ZMM"
sVersion = "Upload Class 1.0"
End Sub
Public Property Get ErrMessage
ErrMessage = sErrors
End Property
Public Property Get Author
Author = sAuthor
End Property
Public Property Get Version
Version = sVersion
End Property
Public Property Let CheckFields(byVal sCheck)
cFields = sCheck
End Property
Public Property Let Folder(byVal sFolder)
folderPath = sFolder
End Property
Public Function Start
Finished = False
bVBCrlf = StrToByte(vbCrlf & vbCrlf)
bSeparate = StrToByte("-----------------------------")
itemCount = 0
sErrors = ""
Call ItemPosition
End Function
Private Function ItemPosition
Dim iStart, iLength : iStart = 1
Do Until InStrB(iStart, formData, bSeparate) = 0
iStart = InStrB(iStart, formData, bSeparate) + LenB(bSeparate) + 14
iLength = InStrB(iStart, formData, bSeparate) - iStart - 2
If Abs(iStart + 2 - LenB(formData)) > 2 Then
ReDim Preserve itemStart(itemCount)
ReDim Preserve itemLength(itemCount)
itemStart(itemCount) = iStart
itemLength(itemCount) = iLength
itemCount = itemCount + 1
End If
Loop
Call FillItemValue
End Function
Private Function FillItemValue
Dim dataPart, bInfor
Dim iStart : iStart = 1
Dim iCount : iCount = 0
Dim iCheck : iCheck = StrToByte("filename")
For i = 0 To itemCount - 1
ReDim Preserve itemName(iCount)
ReDim Preserve itemData(iCount)
ReDim Preserve extenArr(iCount)
ReDim Preserve dataStart(iCount)
ReDim Preserve dataLength(iCount)
dataPart = MidB(formData, itemStart(i), itemLength(i))
iStart = InStrB(1, dataPart, ChrB(34)) + 1
iLength = InStrB(iStart, dataPart, ChrB(34)) - iStart
itemName(iCount) = FormItemName(MidB(dataPart, iStart, iLength))
iStart = InStrB(1, dataPart, bVBCrlf) + 4
iLength = LenB(dataPart) - iStart + 1
If InStrB(1, dataPart, iCheck) > 0 Then
bInfor = MidB(dataPart, 1, iStart - 5)
extenArr(iCount) = FileExtenName(bInfor)
If Mid(folderPath, Len(folderPath) - 1) = "/" Then
itemData(iCount) = folderPath & GetRndName(6) & extenArr(iCount)
Else
itemData(iCount) = folderPath & "/" & GetRndName(6) & extenArr(iCount)
End If
dataStart(iCount) = itemStart(i) + iStart - 2
dataLength(iCount) = iLength
Else
extenArr(iCount) = ""
itemData(iCount) = ByteToStr(MidB(dataPart, iStart, iLength))
dataStart(iCount) = ""
dataLength(iCount) = ""
End If
iCount = iCount + 1
Next
Call SaveUpload
End Function
Private Function FormItemName(byVal bName)
FormItemName = ByteToStr(bName)
End Function
Private Function FileExtenName(byVal bInfor)
Dim pStart, pLength, pContent, regEx
pStart = InStr(1, ByteToStr(bInfor), "filename=" & Chr(34)) + 10
pLength = InStr(pStart, ByteToStr(bInfor), Chr(34)) - pStart
pContent = Mid(ByteToStr(bInfor), pStart, pLength)
If pContent = "" Then
FileExtenName = ""
Else
Set regEx = New RegExp
regEx.Pattern = "^.*(\.[^\.]*)$"
regEx.Global = False
regEx.IgnoreCase = True
FileExtenName = regEx.Replace(pContent, "$1")
Set regEx = Nothing
End If
End Function
Private Function GetRndName(byVal sLen)
Dim regEx, sTemp, arrFields, n : n = 0
Set regEx = New RegExp
regEx.Pattern = "[^\d]*"
regEx.Global = True
regEx.IgnoreCase = True
sTemp = regEx.Replace(Now, "") & "-"
Set regEx = Nothing
arrFields = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", _
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", _
"u", "v", "w", "x", "y", "z", "A", "B", "C", "D", _
"E", "F", "G", "H", "I", "J", "K", "L", "M", "N", _
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", _
"Y", "Z")
Randomize
Do While n < sLen
sTemp = sTemp & CStr(arrFields(61 * Rnd))
n = n + 1
Loop
GetRndName = sTemp
End Function
Private Function SaveUpload
Dim isValidate
Dim filePath, oStreamGet, oStreamPut
isValidate = CheckFile
If isValidate Then
For i = 0 To itemCount - 1
If (dataStart(i) <> "") And (dataLength(i) <> "") Then
If dataLength(i) = 0 Then
itemData(i) = ""
Else
filePath = Server.MapPath(itemData(i))
If CreateFolder("|", ParentFolder(filePath)) Then
Set oStreamGet = Server.CreateObject("ADODB.Stream")
oStreamGet.Type = 1
oStreamGet.Mode = 3
oStreamGet.Open
oStreamGet.Write formData
oStreamGet.Position = dataStart(i)
Set oStreamPut = Server.CreateObject("ADODB.Stream")
oStreamPut.Type = 1
oStreamPut.Mode = 3
oStreamPut.Open
oStreamPut.Write oStreamGet.Read(dataLength(i))
oStreamPut.SaveToFile(filePath)
oStreamGet.Close
Set oStreamGet = Nothing
oStreamPut.Close
Set oStreamPut = Nothing
End If
End If
End If
Next
Finished = True
Call ItemToColl
Else
Finished = False
End If
End Function
Private Function CheckFile
Dim oBoolean : oBoolean = True
If cFields = "" Then
oBoolean = oBoolean And True
Else
For i = 0 To itemCount - 1
If extenArr(i) <> "" Then
If InStr(1, Ucase(cFields), "|" & Ucase(Mid(extenArr(i), 2)) & "|") > 0 Then
oBoolean = oBoolean And True
Else
sErrors = sErrors & "表单[ " & itemName(i) & " ]的文件格式错误!\n" & _
"支持的格式为:" & Replace(Mid(cFields, 2, Len(cFields) - 1), "|", " ") & "\n\n"
oBoolean = oBoolean And False
End If
End If
Next
End If
CheckFile = oBoolean
End Function
Private Function CreateFolder(byVal sLine, byVal sPath)
Dim oFso
Set oFso = Server.CreateObject("Scripting.FileSystemObject")
If Not oFso.FolderExists(sPath) Then
Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^(.*)\\([^\\]*)$"
regEx.Global = False
regEx.IgnoreCase = True
sLine = sLine & regEx.Replace(sPath, "$2") & "|"
sPath = regEx.Replace(sPath, "$1")
If CreateFolder(sLine, sPath) Then CreateFolder = True
Set regEx = Nothing
Else
If sLine = "|" Then
CreateFolder = True
Else
Dim sTemp : sTemp = Mid(sLine, 2, Len(sLine) - 2)
If InStrRev(sTemp, "|") = 0 Then
sLine = "|"
sPath = sPath & "\" & sTemp
Else
Dim Folder : Folder = Mid(sTemp, InStrRev(sTemp, "|") + 1)
sLine = "|" & Mid(sTemp, 1, InStrRev(sTemp, "|") - 1) & "|"
sPath = sPath & "\" & Folder
End If
oFso.CreateFolder sPath
If CreateFolder(sLine, sPath) Then CreateFolder = True
End if
End If
Set oFso = Nothing
End Function
Function ParentFolder(byVal sPath)
Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^(.*)\\[^\\]*$"
regEx.Global = True
regEx.IgnoreCase = True
ParentFolder = regEx.Replace(sPath, "$1")
Set regEx = Nothing
End Function
Private Function StrToByte(byVal sText)
For i = 1 To Len(sText)
StrToByte = StrToByte & ChrB(Asc(Mid(sText, i, 1)))
Next
End Function
Private Function ByteToStr(byVal sByte)
Dim oStream
Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = 2
oStream.Mode = 3
oStream.Open
oStream.WriteText sByte
oStream.Position = 0
oStream.CharSet = "gb2312"
oStream.Position = 2
ByteToStr = oStream.ReadText
oStream.Close
Set oStream = Nothing
End Function
Private Function ItemToColl
For i = 0 To itemCount - 1
If Not Form.Exists(itemName(i)) Then
Form.Add itemName(i), itemData(i)
End If
Next
End Function
Private Sub Class_Terminate
Form.RemoveAll
Set Form = Nothing
End Sub
End Class
If Request.ServerVariables("REQUEST_METHOD") = "POST" Then
Rem 建立上传类实例
Set oUpload = New Upload
Rem 指定允许上传文件的类型
oUpload.CheckFields = "|GIF|BMP|JPG|"
Rem 指定上传文件所存储的相对路径
oUpload.Folder = "51JS.COM-ZMM/UploadFile"
Rem 开始上传处理
oUpload.Start
If oUpload.Finished Then
Rem 上传成功,显示上传信息
Dim sHtml : sHtml = ""
sHtml = sHtml & "<center>"
sHtml = sHtml & "<div 600px;height: 500px;font-size: 10pt;border: 1px solid highlight;overflow: auto;"" align=""left"">"
sHtml = sHtml & "<center 15pt;color: red;"">上传表单数据</center>
"
sHtml = sHtml & "标题:
" & oUpload.Form("P_title") & "
"
sHtml = sHtml & "类型:
" & oUpload.Form("P_assort") & "
"
sHtml = sHtml & "小图:
服务器端路径:<a href=""" & oUpload.Form("P_p_w_picpath_s") & """ target=""_blank"">" & oUpload.Form("P_p_w_picpath_s") & "</a>
<img src=""" & oUpload.Form("P_p_w_picpath_s") & """>
"
sHtml = sHtml & "中图:
服务器端路径:<a href=""" & oUpload.Form("P_p_w_picpath_m") & """ target=""_blank"">" & oUpload.Form("P_p_w_picpath_m") & "</a>
<img src=""" & oUpload.Form("P_p_w_picpath_m") & """>
"
sHtml = sHtml & "大图:
服务器端路径:<a href=""" & oUpload.Form("P_p_w_picpath_b") & """ target=""_blank"">" & oUpload.Form("P_p_w_picpath_b") & "</a>
<img src=""" & oUpload.Form("P_p_w_picpath_b") & """>
"
sHtml = sHtml & "介绍:
" & oUpload.Form("P_content") & "
"
sHtml = sHtml & "</div>"
sHtml = sHtml & "</center>"
Response.Write sHtml
Response.End
Else
Rem 上传失败,显示错误信息
Call ShowMsg(oUpload.ErrMessage, Request.ServerVariables("SCRIPT_NAME"))
End If
Rem 对话框提示函数
Function ShowMsg(byVal sText, byVal sTarget)
Dim sScript : sScript = ""
sScript = sScript & "<script language=""javascript"">" & vbCrlf & _
"window.alert('" & sText & "');" & vbCrlf & _
"window.location.replace('" & sTarget & "');" & vbCrlf & _
"</script>"
Response.Write sScript
Response.End
End Function
End If
%>
<html>
<head>
<title>多文件、表单混合上传类</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
body {
margin: 0px;
border: 0px;
font-size: 10pt;
}
table {
border-collapse: collapse;
font-size: 10pt;
}
td {
font-size: 10pt;
}
</style>
<script language="javascript">
function formCheck(_form) {
for (var i = 0; i < _form.elements.length; i ++) {
if (_form.elements[i].value == '') {
window.alert('请将表单填写完整,提交失败!');
return false;
}
}
return true;
}
</script>
</head>
<body>
<form action="<%=Request.ServerVariables("SCRIPT_NAME")%>" method="post" enctype="multipart/form-data" >
<table width="400" align="center" cellpadding="2" cellspacing="0" border="1" rules="box">
<tr height="26">
<td colspan="2" align="center" 12pt;color: red;">上传功能测试
</td>
</tr>
<tr valign="top">
<td height="30" <td><input type="text" name="P_title" size="20" autocomplete="off"></td>
</tr>
<tr valign="top">
<td height="30" <td>
<select name="P_assort">
<option value="电子">电子</option>
<option value="医疗">医疗</option>
</select>
</td>
</tr>
<tr valign="top">
<td height="30" <td><input type="file" name="P_p_w_picpath_s" oncontextmenu="return false;" onpaste="return false;" ondragenter="return false;"></td>
</tr>
<tr valign="top">
<td height="30" <td><input type="file" name="P_p_w_picpath_m" oncontextmenu="return false;" onpaste="return false;" ondragenter="return false;"></td>
</tr>
<tr valign="top">
<td height="30" <td><input type="file" name="P_p_w_picpath_b" oncontextmenu="return false;" onpaste="return false;" ondragenter="return false;"></td>
</tr>
<tr>
<td height="30" colspan="2" </tr>
<tr>
<td height="30" colspan="2" valign="top">
<textarea name="P_content" cols="50" rows="5"></textarea>
</td>
</tr>
<tr>
<td colspan="2" valign="top" align="center">
<input type="submit" value="提交"> <input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>