受本論壇某些帖子啟發,于是動手編寫了這個程序。該程序支持任何文本和二進制格式文件的上傳;支持文件表單域和普通表單域混合上傳;支持中文文件名;支持覆蓋上傳和文件同名時自動修改文件名;支持同時上傳多個文件,而且多個文件表單域名可以相同;支持上傳文件大小的控制…… 我自己感覺很不錯喲:) 本程序無須任何數據庫支持,直接將上傳的文件保存到服務器指定的路徑下。 測試環境:Windows2000 + IIS 5.0(對ADO版本有要求) 已知BUG:利用相同文件表單名以唯一文件名方式同時上傳多個文件,且服務器上存在多個相同文件名時,只有第一個文件會自動改名上傳成功,然后程序報錯。 源代碼如下,歡迎大家參考指正:
文件名:UploadX.asp <% Dim FormData, FormSize, Divider, bCrLf FormSize = Request.TotalBytes FormData = Request.BinaryRead(FormSize) bCrLf = ChrB(13) & ChrB(10) Divider = LeftB(FormData, InStrB(FormData, bCrLf) - 1)
'將上傳的文件保存到path所指定的目錄下面。 'Formfield上傳表單的"file"域名 'Path 要保存文件的服務器絕對路徑,形式為:"d:\path\subpath"或"d:\path\subpath\" 'MaxSize限制上傳文件的最大長度,以KByte為單位 'SavType服務器保存文件的方式: ' 0 唯一文件名方式,如果有同名則自動改名; ' 1 報錯方式,如果有同名則出錯; ' 2 覆蓋方式,如果有同名則覆蓋原來的文件 Function SaveFile(FormFileField, Path, MaxSize, SavType) Dim StreamObj,StreamObj1 Set StreamObj = Server.CreateObject("ADODB.Stream") Set StreamObj1 = Server.CreateObject("ADODB.Stream") StreamObj.Mode = 3 StreamObj1.Mode = 3 StreamObj.Type = 1 StreamObj1.Type = 1 SaveFile = "" StartPos = LenB(Divider) + 2 FormFileField = Chr(34) & FormFileField & Chr(34) If Right(Path,1) <> "\" Then Path = Path & "\" End If Do While StartPos > 0 strlen = InStrB(StartPos, FormData, bCrLf) - StartPos SearchStr = MidB(FormData, StartPos, strlen) If InStr(bin2str(SearchStr), FormFileField) > 0 Then FileName = bin2str(GetFileName(SearchStr,path,SavType)) If FileName <> "" Then FileStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4 FileLen = InStrB(StartPos, FormData, Divider) - 2 - FileStart If FileLen <= MaxSize*1024 Then FileContent = MidB(FormData, FileStart, FileLen) StreamObj.Open StreamObj1.Open StreamObj.Write FormData StreamObj.Position=FileStart-1 StreamObj.CopyTo StreamObj1,FileLen If SavType =0 Then SavType = 1 End If StreamObj1.SaveToFile Path & FileName, SavType StreamObj.Close StreamObj1.Close If SaveFile <> "" Then SaveFile = SaveFile & ","& FileName Else SaveFile = FileName End If Else If SaveFile <> "" Then SaveFile = SaveFile & ",*TooBig*" Else SaveFile = "*TooBig*" End If End If End If End If If InStrB(StartPos, FormData, Divider) < 1 Then Exit Do End If StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2 Loop End Function
Function GetFormVal(FormName) GetFormVal = "" StartPos = LenB(Divider) + 2 FormName = Chr(34) & FormName & Chr(34) Do While StartPos > 0 strlen = InStrB(StartPos, FormData, bCrLf) - StartPos SearchStr = MidB(FormData, StartPos, strlen) If InStr(bin2str(SearchStr), FormName) > 0 Then ValStart = InStrB(StartPos, FormData, bCrLf & bCrLf) + 4 ValLen = InStrB(StartPos, FormData, Divider) - 2 - ValStart ValContent = MidB(FormData, ValStart, ValLen) If GetFormVal <> "" Then GetFormVal = GetFormVal & "," & bin2str(ValContent) Else GetFormVal = bin2str(ValContent) End If End If If InStrB(StartPos, FormData, Divider) < 1 Then Exit Do End If StartPos = InStrB(StartPos, FormData, Divider) + LenB(Divider) + 2 Loop End Function
Function bin2str(binstr) Dim varlen, clow, ccc, skipflag skipflag = 0 ccc = "" varlen = LenB(binstr) For i = 1 To varlen If skipflag = 0 Then clow = MidB(binstr, i, 1) If AscB(clow) > 127 Then ccc = ccc & Chr(AscW(MidB(binstr, i + 1, 1) & clow)) skipflag = 1 Else ccc = ccc & Chr(AscB(clow)) End If Else skipflag = 0 End If Next bin2str = ccc End Function
Function str2bin(str) For i = 1 To Len(str) str2bin = str2bin & ChrB(Asc(Mid(str, i, 1))) Next End Function
Function GetFileName(str,path,savtype) Set fs = Server.CreateObject("Scripting.FileSystemObject") str = RightB(str,LenB(str)-InstrB(str,str2bin("filename="))-9) GetFileName = "" FileName = "" For i = LenB(str) To 1 Step -1 If MidB(str, i, 1) = ChrB(Asc("\")) Then FileName = MidB(str, i + 1, LenB(str) - i - 1) Exit For End If Next If savtype = 0 and fs.FileExists(path & bin2str(FileName)) = True Then hFileName = FileName rFileName = "" For i = LenB(FileName) To 1 Step -1 If MidB(FileName, i, 1) = ChrB(Asc(".")) Then hFileName = LeftB(FileName, i-1) rFileName = RightB(FileName, LenB(FileName)-i+1) Exit For End If Next For i = 0 to 9999 'hFileName = hFileName & str2bin(i) If fs.FileExists(path & bin2str(hFileName) & i & bin2str(rFileName)) = False Then FileName = hFileName & str2bin(i) & rFileName Exit For End If Next End If Set fs = Nothing GetFileName = FileName End Function %>
應用舉例:
upload.htm
<html>
<head> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <title>New Page 1</title> </head>
<body>
<form method="POST" action="upload.asp" enctype="multipart/form-data"> <p>姓名:<input type="text" name="name" size="20"></p> <p>城市:<input type="text" name="city" size="20"></p> <p>愛好:1、<input type="text" name="lover" size="10">2、<input type="text" name="lover" size="10"></p> <p>性別:<input type="radio" value="男" checked name="sex">男 <input type="radio" name="sex" value="女">女</p> <p>省份:<select size="1" name="province"> <option selected value="江蘇">江蘇</option> <option value="山西">山西</option> </select></p> 愛好(補充):3、<input type="text" name="lover" size="10">4、<input type="text" name="lover" size="10"> <p>作品1:<input type="file" name="fruit" size="20"></p> <p>作品1:<input type="file" name="fruit" size="20"></p> <p>作品2:<input type="file" name="fruit2" size="20"></p> <p><input type="submit" value="提交" name="subbutt"><input type="reset" value="全部重寫" name="rebutt"></p> </form>
</body>
</html>
upload.asp
<%@ LANGUAGE = VBScript %> <!-- #include file="uploadx.asp" --> <% Response.Write "<br>Name=""" & GetFormVal("name") & """" Response.Write "<br>Sex=""" & GetFormVal("sex") & """" Response.Write "<br>province=""" & GetFormVal("province") & """" Response.Write "<br>city=""" & GetFormVal("city") & """" Response.Write "<br>lover=""" & GetFormVal("lover") & """" dim filename path = Server.MapPath("./") filename = SaveFile("fruit",path,1024,0) If filename <> "*TooBig*" Then Response.Write "<br><br>""" & filename & """已經上傳" Else Response.Write "<br><br>文件超出限制太大" End IF
filename = SaveFile("fruit2",path,1024,0) If filename <> "*TooBig*" Then Response.Write "<br><br>""" & filename & """已經上傳" Else Response.Write "<br><br>文件超出限制太大" End IF %>
|