主题: ASP上传附件功能(在页面中用框架调用) |
作者: xdxxlh, 发布日期: 2009-05-22 15:44:04, 浏览数: 10753 |
看了“炫羽”朋友发的《增加附件上传功能》一文,确实是高手,特别是共享精神令人佩服!本着开源的思想,也把自己的一些不成熟的经验发布一下,供大家参考。 还是先上图片: 主文件两个UpLoadClass.asp和upload.asp UpLoadClass.asp是风声的无组件上传类 upload.asp是文件上传文件 UpLoadClass.asp源代码: <% '---------------------------------------------------------- '************** 风声 ASP 无组件上传类 V2.11 ************* '作者:风声 '网站:http://www.fonshen.com '邮件:webmaster@fonshen.com '版权:版权全体,源代码公开,各种用途均可免费使用 '********************************************************** '---------------------------------------------------------- Class UpLoadClass Private m_TotalSize,m_MaxSize,m_FileType,m_SavePath,m_AutoSave,m_Error,m_Charset Private m_dicForm,m_binForm,m_binItem,m_strDate,m_lngTime Public FormItem,FileItem Public Property Get Version Version="Fonshen ASP UpLoadClass Version 2.11" End Property Public Property Get Error Error=m_Error End Property Public Property Get Charset Charset=m_Charset End Property Public Property Let Charset(strCharset) m_Charset=strCharset End Property Public Property Get TotalSize TotalSize=m_TotalSize End Property Public Property Let TotalSize(lngSize) if isNumeric(lngSize) then m_TotalSize=Clng(lngSize) End Property Public Property Get MaxSize MaxSize=m_MaxSize End Property Public Property Let MaxSize(lngSize) if isNumeric(lngSize) then m_MaxSize=Clng(lngSize) End Property Public Property Get FileType FileType=m_FileType End Property Public Property Let FileType(strType) m_FileType=strType End Property Public Property Get SavePath SavePath=m_SavePath End Property Public Property Let SavePath(strPath) m_SavePath=Replace(strPath,chr(0),"") End Property Public Property Get AutoSave AutoSave=m_AutoSave End Property Public Property Let AutoSave(byVal Flag) select case Flag case 0,1,2: m_AutoSave=Flag end select End Property Private Sub Class_Initialize m_Error = -1 m_Charset = "gb2312" m_TotalSize= 0 m_MaxSize = 153600 m_FileType = "jpg/gif" m_SavePath = "" m_AutoSave = 0 Dim dtmNow : dtmNow = Date() m_strDate = Year(dtmNow)&Right("0"&Month(dtmNow),2)&Right("0"&Day(dtmNow),2) m_lngTime = Clng(Timer()*1000) Set m_binForm = Server.CreateObject("ADODB.Stream") Set m_binItem = Server.CreateObject("ADODB.Stream") Set m_dicForm = Server.CreateObject("Scripting.Dictionary") m_dicForm.CompareMode = 1 End Sub Private Sub Class_Terminate m_dicForm.RemoveAll Set m_dicForm = nothing Set m_binItem = nothing m_binForm.Close() Set m_binForm = nothing End Sub Public Function Open() Open = 0 if m_Error=-1 then m_Error=0 else Exit Function end if Dim lngRequestSize : lngRequestSize=Request.TotalBytes if m_TotalSize>0 and lngRequestSize>m_TotalSize then m_Error=5 Exit Function elseif lngRequestSize<1 then m_Error=4 Exit Function end if Dim lngChunkByte : lngChunkByte = 102400 Dim lngReadSize : lngReadSize = 0 m_binForm.Type = 1 m_binForm.Open() do m_binForm.Write Request.BinaryRead(lngChunkByte) lngReadSize=lngReadSize+lngChunkByte if lngReadSize >= lngRequestSize then exit do loop m_binForm.Position=0 Dim binRequestData : binRequestData=m_binForm.Read() Dim bCrLf,strSeparator,intSeparator bCrLf=ChrB(13)&ChrB(10) intSeparator=InstrB(1,binRequestData,bCrLf)-1 strSeparator=LeftB(binRequestData,intSeparator) Dim strItem,strInam,strFtyp,strPuri,strFnam,strFext,lngFsiz Const strSplit="'"">" Dim strFormItem,strFileItem,intTemp,strTemp Dim p_start : p_start=intSeparator+2 Dim p_end Do p_end = InStrB(p_start,binRequestData,bCrLf&bCrLf)-1 m_binItem.Type=1 m_binItem.Open() m_binForm.Position=p_start m_binForm.CopyTo m_binItem,p_end-p_start m_binItem.Position=0 m_binItem.Type=2 m_binItem.Charset=m_Charset strItem = m_binItem.ReadText() m_binItem.Close() intTemp=Instr(39,strItem,"""") strInam=Mid(strItem,39,intTemp-39) p_start = p_end + 4 p_end = InStrB(p_start,binRequestData,strSeparator)-1 m_binItem.Type=1 m_binItem.Open() m_binForm.Position=p_start lngFsiz=p_end-p_start-2 m_binForm.CopyTo m_binItem,lngFsiz if Instr(intTemp,strItem,"filename=""")<>0 then if not m_dicForm.Exists(strInam&"_From") then strFileItem=strFileItem&strSplit&strInam if m_binItem.Size<>0 then intTemp=intTemp+13 strFtyp=Mid(strItem,Instr(intTemp,strItem,"Content-Type: ")+14) strPuri=Mid(strItem,intTemp,Instr(intTemp,strItem,"""")-intTemp) intTemp=InstrRev(strPuri,"\") strFnam=Mid(strPuri,intTemp+1) m_dicForm.Add strInam&"_Type",strFtyp m_dicForm.Add strInam&"_Name",strFnam m_dicForm.Add strInam&"_Path",Left(strPuri,intTemp) m_dicForm.Add strInam&"_Size",lngFsiz if Instr(strFnam,".")<>0 then strFext=Mid(strFnam,InstrRev(strFnam,".")+1) else strFext="" end if select case strFtyp case "image/jpeg","image/pjpeg","image/jpg" if Lcase(strFext)<>"jpg" then strFext="jpg" m_binItem.Position=3 do while not m_binItem.EOS do intTemp = Ascb(m_binItem.Read(1)) loop while intTemp = 255 and not m_binItem.EOS if intTemp < 192 or intTemp > 195 then m_binItem.read(Bin2Val(m_binItem.Read(2))-2) else Exit do end if do intTemp = Ascb(m_binItem.Read(1)) loop while intTemp < 255 and not m_binItem.EOS loop m_binItem.Read(3) m_dicForm.Add strInam&"_Height",Bin2Val(m_binItem.Read(2)) m_dicForm.Add strInam&"_Width",Bin2Val(m_binItem.Read(2)) case "image/gif" if Lcase(strFext)<>"gif" then strFext="gif" m_binItem.Position=6 m_dicForm.Add strInam&"_Width",BinVal2(m_binItem.Read(2)) m_dicForm.Add strInam&"_Height",BinVal2(m_binItem.Read(2)) case "image/png" if Lcase(strFext)<>"png" then strFext="png" m_binItem.Position=18 m_dicForm.Add strInam&"_Width",Bin2Val(m_binItem.Read(2)) m_binItem.Read(2) m_dicForm.Add strInam&"_Height",Bin2Val(m_binItem.Read(2)) case "image/bmp" if Lcase(strFext)<>"bmp" then strFext="bmp" m_binItem.Position=18 m_dicForm.Add strInam&"_Width",BinVal2(m_binItem.Read(4)) m_dicForm.Add strInam&"_Height",BinVal2(m_binItem.Read(4)) case "application/x-shockwave-flash" if Lcase(strFext)<>"swf" then strFext="swf" m_binItem.Position=0 if Ascb(m_binItem.Read(1))=70 then m_binItem.Position=8 strTemp = Num2Str(Ascb(m_binItem.Read(1)), 2 ,8) intTemp = Str2Num(Left(strTemp, 5), 2) strTemp = Mid(strTemp, 6) while (Len(strTemp) < intTemp * 4) strTemp = strTemp & Num2Str(Ascb(m_binItem.Read(1)), 2 ,8) wend m_dicForm.Add strInam&"_Width", Int(Abs(Str2Num(Mid(strTemp, intTemp + 1, intTemp), 2) - Str2Num(Mid(strTemp, 1, intTemp), 2)) / 20) m_dicForm.Add strInam&"_Height",Int(Abs(Str2Num(Mid(strTemp, 3 * intTemp + 1, intTemp), 2) - Str2Num(Mid(strTemp, 2 * intTemp + 1, intTemp), 2)) / 20) end if end select m_dicForm.Add strInam&"_Ext",strFext m_dicForm.Add strInam&"_From",p_start if m_AutoSave<>2 then intTemp=GetFerr(lngFsiz,strFext) m_dicForm.Add strInam&"_Err",intTemp if intTemp=0 then if m_AutoSave=0 then strFnam=GetTimeStr() if strFext<>"" then strFnam=strFnam&"."&strFext end if m_binItem.SaveToFile Server.MapPath(m_SavePath&strFnam),2 m_dicForm.Add strInam,strFnam end if end if else m_dicForm.Add strInam&"_Err",-1 end if end if else m_binItem.Position=0 m_binItem.Type=2 m_binItem.Charset=m_Charset strTemp=m_binItem.ReadText if m_dicForm.Exists(strInam) then m_dicForm(strInam) = m_dicForm(strInam)&","&strTemp else strFormItem=strFormItem&strSplit&strInam m_dicForm.Add strInam,strTemp end if end if m_binItem.Close() p_start = p_end+intSeparator+2 loop Until p_start+3>lngRequestSize FormItem=Split(strFormItem,strSplit) FileItem=Split(strFileItem,strSplit) Open = lngRequestSize End Function Private Function GetTimeStr() m_lngTime=m_lngTime+1 GetTimeStr=m_strDate&Right("00000000"&m_lngTime,8) End Function Private Function GetFerr(lngFsiz,strFext) dim intFerr intFerr=0 if lngFsiz>m_MaxSize and m_MaxSize>0 then if m_Error=0 or m_Error=2 then m_Error=m_Error+1 intFerr=intFerr+1 end if if Instr(1,LCase("/"&m_FileType&"/"),LCase("/"&strFext&"/"))=0 and m_FileType<>"" then if m_Error<2 then m_Error=m_Error+2 intFerr=intFerr+2 end if GetFerr=intFerr End Function Public Function Save(Item,strFnam) Save=false if m_dicForm.Exists(Item&"_From") then dim intFerr,strFext strFext=m_dicForm(Item&"_Ext") intFerr=GetFerr(m_dicForm(Item&"_Size"),strFext) if m_dicForm.Exists(Item&"_Err") then if intFerr=0 then m_dicForm(Item&"_Err")=0 end if else m_dicForm.Add Item&"_Err",intFerr end if if intFerr<>0 then Exit Function if VarType(strFnam)=2 then select case strFnam case 0:strFnam=GetTimeStr() if strFext<>"" then strFnam=strFnam&"."&strFext case 1:strFnam=m_dicForm(Item&"_Name") end select end if m_binItem.Type = 1 m_binItem.Open m_binForm.Position = m_dicForm(Item&"_From") m_binForm.CopyTo m_binItem,m_dicForm(Item&"_Size") m_binItem.SaveToFile Server.MapPath(m_SavePath&strFnam),2 m_binItem.Close() if m_dicForm.Exists(Item) then m_dicForm(Item)=strFnam else m_dicForm.Add Item,strFnam end if Save=true end if End Function Public Function GetData(Item) GetData="" if m_dicForm.Exists(Item&"_From") then if GetFerr(m_dicForm(Item&"_Size"),m_dicForm(Item&"_Ext"))<>0 then Exit Function m_binForm.Position = m_dicForm(Item&"_From") GetData = m_binForm.Read(m_dicForm(Item&"_Size")) end if End Function Public Function Form(Item) if m_dicForm.Exists(Item) then Form=m_dicForm(Item) else Form="" end if End Function Private Function BinVal2(bin) dim lngValue,i lngValue=0 for i = lenb(bin) to 1 step -1 lngValue = lngValue *256 + Ascb(midb(bin,i,1)) next BinVal2=lngValue End Function Private Function Bin2Val(bin) dim lngValue,i lngValue=0 for i = 1 to lenb(bin) lngValue = lngValue *256 + Ascb(midb(bin,i,1)) next Bin2Val=lngValue End Function Private Function Num2Str(num, base, lens) Dim ret,i ret = "" while(num >= base) i = num Mod base ret = i & ret num = (num - i) / base wend Num2Str = Right(String(lens, "0") & num & ret, lens) End Function Private Function Str2Num(str, base) Dim ret, i ret = 0 for i = 1 to Len(str) ret = ret * base + Cint(Mid(str, i, 1)) next Str2Num = ret End Function End Class %> upload.asp源代码 <!--#include file="conn.asp"--> <!--#include file="UpLoadClass.asp"--> <%Server.ScriptTimeOut=5000%> <% '调用网页头部代码 'call header("上传文件") %> <body class="tdbg"> <% '定义常量(此处变量也可以) Const Upload_PicPath = "uploadfile/" '文件上传目录 Const Upload_FileExt = "txt/doc/xls/rar/zip/exe/wps/chm/hlp" '允许上传文件类型 Const Upload_PicFileSize = "200" '允许上传文件大小(单位:K) Dim request2,ArticleFolder,UploadFolderPath ArticleFolder=YCgetTime(Now,10) & "/" '设定当前年月目录 UploadFolderPath="../" & Upload_PicPath & ArticleFolder '设置文件存放的路径 Call FolderNameCheck(UploadFolderPath) '检查文件夹 '建立上传对象 Set request2=New UpLoadClass 'request2.Charset="gb2312" '设置字符集 request2.MaxSize=Upload_PicFileSize*1024 '设置上传文件的最大字节数 request2.FileType=Upload_FileExt '设置允许上传文件的类型 request2.SavePath=UploadFolderPath '设置文件存放的路径 request2.AutoSave=0 '设置文件保存方式 request2.Open()'打开对象 If request2.Error=0 Then Response.Write "<script type=""text/javascript"">parent.insertHtml('content1', '<a href="&request2.SavePath & request2.Form("filename") &">"&request2.form("filename"&"_Name")&"</a>');</script>" & vbCrlf Call Response.Write("<script>window.setTimeout(""location.href='Admin_Article_Upload.asp'"",0);</script>") Else Call Message(0,Err2Info(request2.Error),"?") 'Response.Write Err2Info(request2.Error) End If Set request2=Nothing Sub FolderNameCheck(FolderNameNew) '检查文件名是否含有特殊字符,如果含有则错误提示 Dim Letters,i,c,fso Letters="+=:;,[]<>\|*?" For i=1 To len(FolderNameNew) c=mid(FolderNameNew,i,1) If inStr(Letters,c)<>0 Then Call Message(0,"上传失败,文件夹名称含有特殊字符","?") End If Next '检查文件夹是否存在,如果不存在就创建文件夹 Set fso=Server.CreateObject("Scripting.FileSystemObject") If fso.FolderExists(server.MapPath(FolderNameNew))=False Then fso.CreateFolder(server.MapPath(FolderNameNew)) End If Set fso=Nothing End Sub Function Err2Info(Error) Select Case Error Case -1:Err2Info = "文件上传失败,请选择文件。" Case 0: Err2Info = "文件上传成功。" Case 1: Err2Info = "文件上传失败,不能上传超过"&Upload_PicFileSize&"KB的文件。" Case 2: Err2Info = "文件上传失败,只允许上传后缀名为"""&Replace(Upload_FileExt,"/",",")&"""的文件。" Case 3: Err2Info = "文件上传失败,不能上传超过"&Upload_PicFileSize&"KB的文件,并且只允许上传后缀名为"""&Replace(Upload_FileExt,"/",",")&"""的文件。" Case 4: Err2Info = "文件上传失败。" End Select End Function '============================================ '--格式化时间 '--tempTime 为所要格式化的时间 '--tempPar 取值为1、2、3、4、5、6、7、8,分别表示8种时间显示格式 '============================================ function YCgetTime(tempTime,tempPar) if IsDate(tempTime) then dim y : y = Year(tempTime) dim m : m = Month(tempTime) dim d : d = Day(tempTime) dim h : h = Hour(tempTime) dim n : n = Minute(tempTime) dim s : s = Second(tempTime) if m < 10 then m = "0"&m if d < 10 then d = "0"&d if h < 10 then h = "0"&h if n < 10 then n = "0"&n if s < 10 then s = "0"&s dim newTime select case tempPar case 1 : newTime = y&"-"&m&"-"&d&" "&h&":"&n&":"&s case 2 : newTime = y&"-"&m&"-"&d case 3 : newTime = y&"年"&m&"月"&d&"日"&h&"时"&n&"分"&s&"秒" case 4 : newTime = Right(y,2)&"年"&m&"月"&d&"日" case 5 : newTime = y&"年"&m&"月"&d&"日" case 6 : newTime = Right(y,2)&"-"&m&"-"&d case 7 : newTime = m&"-"&d case 8 : newTime = m&"月"&d&"日" Case 9 : newtime = y&m&d&h&n&s Case 10 : newtime = y&m end select YCgetTime = newTime else YCgetTime = tempTime end if end Function '============================================ '操作成功输出 '============================================ Function Message(byval tempPar,byval tempMessage,byval tempUrl) Call ConnEnd() dim tempString : tempString = "" select case tempPar case 0: tempString = "history.go(-1);" case 1: tempString = "window.location='"&tempUrl&"';" case 2: tempString = "window.parent.location='"&tempUrl&"';" case 3: tempString = "" end select if Right(tempMessage,2) = "\n" then tempMessage = Left(tempMessage,Len(tempMessage)-2) Response.Write("<"&"script>alert('"&tempMessage&"');"&tempString&"<"&"/script>") Response.End End Function %> 最后在添加文章的页面添加以下代码就可以了: <tr> <td>上传图片</td> <td><iframe border="0" frameBorder="0" noResize scrolling="no" width="100%" src="Upload.asp" height="22" vspace="0" hspace="0" marginwidth="0" marginheight="0"></iframe></td> </tr> |
作者: heiness, 发布日期: 2010-01-03 14:55:41 |
这些文件该放到哪里呢? |
回复 |
作者: huangyun, 发布日期: 2010-08-14 18:17:28 |
看不明白啊!麻烦详细的说一下我的QQ858893299,麻烦加我一下教我一下!谢谢!
|
回复 |
作者: Kxuan, 发布日期: 2012-06-09 09:54:07 |
可以加QQ,吗?498865785
|
回复 |