你的朋友  推荐博客
该博客的主人很懒,什么都没有留下。
我的日志
时间: 2008.03.22 16:47:00 阴
标签:  asp
上传文件扩展名限制、文件大小限制。

代码如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

<%
Dim FormData,FormSize,DataStart,CLStr,DivStr
FormSize=Request.TotalBytes'上传文件的大小
FormData=Request.BinaryRead(FormSize)'上传文件的二进制数据
IF FormSize < 2500289 Then'限制2.5M以下
If FormSize<>0 Then
ExtName = "jpg,gif,txt,zip,doc,rar,xls"    '允许扩展名
Dim Contenta,Contentb,Contentc

SavePath = "jpg\"'保存文件路径
response.Write("接收到的数据大小="&FormSize&"字节<br>")
CLStr=ChrB(13)&ChrB(10)'以回车和换行符为分隔符
divider=leftB(FormData,clng(instrb(FormData,CLStr))-1)'取得分隔符divider

'在程序中直接调用该函数就可获得所需文件(或文本框)内容,如下所示:
Contenta=getdata (FormData, divider, FormSize,"a")'返回数据段说明字段(二进制)
Contentb=getdata (FormData, divider, FormSize,"b")'返回数据(二进制)
Contentc=getdata (FormData, divider, FormSize,"c")'返回表单内容(二进制)第1段
'获取文件名
filesa=BtoS(Contenta)'文件信息转化为字符
ffil=inStrRev(filesa,"\")'从右边起查找\
ffila=inStr(filesa,"\")'从左边起查找 \
toll=len(filesa)'文件名长度
Response.Write("文件长度:"& lenb(Contentb) &"字节<br>")
if ffil<>0 then'有上传文件
ffiles=mid(filesa,ffil 1,len(filesa)-inStrRev(filesa,"\")-1)'提取文件名
If (CheckFileExt(ffiles,ExtName)) Then'检查文件扩展名
 If Err Then'上传是否出错
        Response.Write "文件上传: 文件上传出错!</span> <a href=""" & Request.ServerVariables("URL") &""">重新上传文件</a><br />"
        Err.Clear
     Response.End()
      Else'上传未出错
SavePath=CheckAndCreateFolder(SavePath)
Dpath=Server.MapPath(SavePath)
Dpath=mid(Dpath,1,inStrRev(Dpath,"\"))
fullpath=Dpath&SavePath&ffiles'设置完整文件路径
sdk=Instrb(FormData,CLStr&CLStr) 4'开始位置
Si=lenb(Contentb)'上传数据长度
'Si=Instrb(sdk 1,FormData,Instrb(sdk,FormData,divider))
'Response.write("fullpath="&fullpath &"<br>")
 Set ffso = Server.CreateObject("Scripting.FileSystemObject")
'Response.Write(ffso.FileExists(fullpath))
 If ffso.FileExists(fullpath) Then
'调用检查文件是否重名函数,如重名自动换名。不在同一目录用完整路径
    fullpath=CheckFileExists(fullpath)
    Response.Write("文件"&ffiles&"已存在!!!重名名文件名并上传"&"<br>")
 ffiles=mid(fullpath,inStrRev(fullpath,"\") 1,len(fullpath)-InStrRev(fullpath,"\"))
Response.Write("新文件名:"&ffiles&"<br>")
   Else
'   fullpath=CheckFileExists(fullpath)
   Response.Write("文件"""&ffiles&"""不存在继续上传"&"<BR>")
   End If
'Response.write("fullpath="&fullpath &"<br>")
'Response.Write("FileExists="&(ffso.FileExists(fullpath))&"<br>")
  set ffso=Nothing
  Response.Write("<br>")
'如果上传的文件不为空文件(文件长度大于0字节)则进行上传。
if Si>0  then '数据不为空
  set str=server.CreateObject("ADODB.Stream") 'str为源数据流
  str.Mode=3 '设置打开模式,3为可读可写
  str.Type=1 '设置数据类型,1为二进制数据
  str.Open
  set desc=server.CreateObject("ADODB.Stream") 'desc为目标数据流
  desc.Mode=3
  Desc.Type=1
  desc.Open
  str.Write FormData'Contentc ' 赋值源数据流
  str.Position=sdk-1'sdk-1指出文件的开始位置
  str.CopyTo desc,Si' Si表示文件的长度
desc.SaveToFile fullpath ,2 '以fullpath指定的路径及名称保存文件2表示执行覆盖原有文件

  Desc. Close
  Set desc=nothing
  Str. Close
  Set STR=nothing
End If'数据不为空
End If'上传是否出错
SaveFileName = Mid(fullpath,InstrRev(fullpath,"\") 1)
Response.write "<span style=""color:red;"">" & SaveFileName & " </span>文件上传成功! <a href=""" & Request.ServerVariables("URL") &""">继续上传文件</a><br />"
Response.End()
else'文件扩展名不正确
Response.Write("文件"""&ffiles&"""扩展名不符合要求,检查文件扩展名!!!<br>")
Response.write "<span style=""color:red;"">文件格式不正确!</span> <a href=""" & Request.ServerVariables("URL") &""">重新上传文件</a><br />"
Response.End()
end if''检查文件扩展名
end if'有上传文件

End If
else
Response.write "<span style=""color:red;"">文件大小超过 XX M!</span> <a href=""" & Request.ServerVariables("URL") &""">重新上传文件</a><br />"
Response.End()
End If
%>
<%
'自定义函数2个
Function BtoS (bstr) '二进制转换成字符
If not IsNull(bstr) Then
 for i = 0 to lenb(bstr) - 1
 bchr = midb(bstr,i 1,1)
  If ascb(bchr)>127 Then '汉字是双字节,得两个字符一起处理
  temp = temp&chr(ascw(midb(bstr, i 2, 1)&bchr))
  i = i 1
  Else
  temp = temp&chr(ascb(bchr))
  End If
 next
End If
BtoS = temp
End Function

'获得文件(或文本框)内容
'在实际的WEB应用中,上传操作可能涉及多项内容,如多个文本框、多个文件等等。文件和文本框很好区分,
'文件的数据中包含了"filename="字串。因此,我们写了如下的通用函数,既可用于提取文件内容,又可提取文本框内容(需进行二进制转换):
Function getdata(byval data, byval divider, final, xu) 'data表示二进制串;divider表示分割符;final表示数据的结束位置
'xu=a反说明段xu=b反文件内容xu=c反表单内容
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34) '字符串"filename"的二进制表示
bncrlf=chrb(13)&chrb(10) '二进制的回车符
startpos = instrb(data,divider) lenb(divider) lenb(bncrlf) ' 开始位置
endpos = instrb(startpos,data, divider)-lenb(bncrlf) '结束位置
endpose= instrb(endpos lenb(divider),data,divider)-lenb(bncrlf)'表单后的分隔符
part1 = midb(data, startpos, endpos-startpos) '两个分割符之间的内容:说明及文件内容两部分
part2 = midb(data, endpos lenb(divider) lenb(bncrlf),endpose-endpos-lenb(divider))'表单内容
firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' 内容之前的说明段
If xu="a" then
Getdata=firstline'返回说明段
Else
 if xu="b" then
  If (instrb(firstline,filename)=0) Then '若为文本框,获得文本框字符串内容
   stemp=midb(part1,instrb(part1,bncrlf&bncrlf) lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf) lenb(bncrlf&bncrlf))
   getdata=BtoS(stemp)
   Else '若为文件,获得文件二进制内容
    Getdata=midb(part1,instrb(part1, bncrlf&bncrlf) lenb (bncrlf&bncrlf), lenb (part1)-instrb(part1,bncrlf&bncrlf) lenb(bncrlf&bncrlf))
   End If
  else
   If xu="c" then
     Getdata=part2'反表单内容
  else
   end if
 end if
End If
Final=endpos
End function

'判断文件类型是否合格
  Function CheckFileExt(FileName,ExtName) '文件名,允许上传文件类型
    FileType = ExtName
    FileType = Split(FileType,",")
    For i = 0 To Ubound(FileType)
      If LCase(Right(FileName,3)) = LCase(FileType(i)) then
      CheckFileExt = True
      Exit Function
      Else
      CheckFileExt = False
      End if
    Next
  End Function
'检查上传文件夹是否存在,不存在则创建文件夹
  Function CheckAndCreateFolder(FolderName)
    fldr = Server.Mappath(FolderName)
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(fldr) Then
      fso.CreateFolder(fldr)
    End If
 CheckAndCreateFolder=FolderName
    Set fso = Nothing
  End Function
'检查文件是否存在,重命名存在文件
Function CheckFileExists(FileName)
  Set fso=Server.CreateObject("Scripting.FileSystemObject")
  If fso.FileExists(FileName) Then'SaveFile) Then
    i=1
    msg=True
    Do While msg
      CheckFileExists = Replace(FileName,Right(FileName,4),"_" & i & Right(FileName,4))
      If Not fso.FileExists(CheckFileExists) Then
        msg=False
      End If
      i=i 1
    Loop
  Else
    CheckFileExists = FileName
  End If
  Set fso=Nothing
End Function

%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>ASP上传文件</title>
</head>

<body>
<form action="filup.asp" method="post" enctype="multipart/form-data" name="form1">
<table>
  <tr><td valign="middle" headers="35"><span style="color:red;">文件大小不能超过 1 M否则无法完成上传</span></td></tr>
<tr><td>  <input type="file" name="file"><input name="提交" type="submit" value="提交">
      </td></tr>
  <tr><td></td></tr>
  </table>
</form>
</body>
</html>

作者 yangerjun  评论() |  人气() | 引用()  | 推荐 | 问题日志 | 收藏到网摘 | 返回首页
我的信息
最新日志
日志分类
最新评论
  • 访客/2008-06-24
  • ....
我的相册
日历