ASP 单文件上传无组件代码

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
'禁止缓存'
Response.CacheControl="no-cache"  
Response.Expires=-1
Response.Charset="UTF-8"    '配合第一行设定网页编码
 
if Request.TotalBytes then	'如果上传文件非空'
	set read_stream=createobject("adodb.stream")	'设置一个流'
	read_stream.Type=1	'这个流读二进制数据,如果Type=2则读文本数据'
	read_stream.Open	'打开流'
	read_stream.write Request.BinaryRead(Request.TotalBytes)	'将表单传过来的二进制数据写入流read_stream'
	'将流read_stream的所有数据读到binary_stream中,binary_stream相当于一个临时变量,接下来将对binary_stream进行切割,以免污染read_stream中的原数据'
	read_stream.Position=0
	binary_stream=read_stream.Read
 
	enter=chrB(13)&chrB(10)	'二进制流中的回车'
	first_enter=clng(instrb(binary_stream,enter))	'寻找第一个回车的位置'
	second_enter=instrb(first_enter+1,binary_stream,enter)	'寻找第二个回车的位置'
 
	set write_stream=createobject("adodb.stream")	'定义一个流write_stream'
	write_stream.type=1	'write_stream是处理二进制数据的'
	write_stream.open
	'将read_stream中文件信息部分写到write_stream'
	read_stream.Position=first_enter+1
	read_stream.copyto write_stream,second_enter-first_enter-3
	
	write_stream.Position=0
	write_stream.type=2	'再将write_stream转为文本流'
	write_stream.CharSet="UTF-8"
	file_info=write_stream.readtext	'写到file_info这个字符串'
	write_stream.Close	'暂且关闭write_stream这个流,接下来对file_info这个字符串进行切割'
 
	file_name=mid(file_info,instrRev(file_info,"\")+1)	'取得全文件名'
	file_name=mid(file_name,instrRev(file_name,"=")+2)
	file_pre_suffix=left(file_name,instrRev(file_name,".")-1)	'取得文件前缀'
	suffix=mid(file_name,instrRev(file_name,"."))	'取得文件后缀,带.的'
	
   
	server_file_name=file_pre_suffix&"_"&datediff("s","1970-01-01 00:00:00",now)&suffix	'在服务器保存的文件名就是“原文件前缀_时间戳.原文件后缀名”'
	
	delimiter=leftB(binary_stream,clng(instrb(binary_stream,enter))-1)	'取得文件分隔符,用于给字符串处理函数找到文件内容'
	third_enter=instrb(second_enter+1,binary_stream,enter)	'找第三个回车的位置'
	file_begin_position=clng(instrb(third_enter+1,binary_stream,enter))+1	'获取文件内容第一个字符之前的位置'
	file_end_position=clng(instrb(lenb(delimiter),binary_stream,delimiter))-3  '获取文件内容中最后一个字符的位置,就是第二个分隔符"delimiter"开始的前一个二进制字符'
 
	write_stream.type=1	'write_stream是处理二进制数据'
	write_stream.open
	read_stream.Position=file_begin_position	'将流read_stream的开始位置移到文件开始的位置'
	read_stream.copyto write_stream,file_end_position-file_begin_position	'把流read_stream的开始位置之后 长为 文件长度 的内容复制到write_stream,其中文件长度就是文件结束的位置file_end_position-文件开始的位置file_begin_position'

	write_stream.SaveToFile server.mappath("upload_file/"&server_file_name),2	'将write_stream转化为文件,保存在设定好的文件目录'
 
	'人走带门,关闭所有用到的流'	
	write_stream.Close
	Set write_stream=nothing
	read_stream.Close
	Set read_stream=nothing
 
	'打印文件信息到网页'
	response.write "您上传的文件是:"&file_name&"<br>"
	response.write "您上传文件的后缀为:"&suffix&"<br>"
	url="http://"&Request.ServerVariables("HTTP_HOST")&"/rf/upload_file/"&server_file_name
	response.write "访问地址:<a href='"&url&"' target='_blank'>"&url&"</a><br>"
	response.write "<a href='返回地址'>返回</a><br>" 
   
end if
%>

原网上发布的代码执行有问题,现找到问题所在,对问题所在处进行了修改,直接就可以使用。

这个是FORM 提交后保存代码save.asp,下面是上传页,自由设计。

<form method="post" action="save.asp" enctype="multipart/form-data">
        <input type="file" name="file"/>
        <input type="submit" value="提交" />
    </form>

一、简介 自从接触ASP就开始接触上传,看过一些上传类,但是总感觉封装的还是不够简,因此自己尝试写一个能够用最少最简代码实现各种上传方式的上传类。在学校期间就开始写,一点点的完善、优化,到现在的版本,现在的版本能适应各种上传方式。上 传类的主要的功能如下: 1、自由设置最大上传大小、文件最大上传大小 2、自由设置允许上传的文件类型 3、可设置文本的编码,以适应各种上传环境 4、内置进度条,用户可选择开启和关闭 5、多种错误状态处理 6、多种文件保存方式:原文件名、随机文件名、用户自定义文件名 7、自由选择是否覆盖已存在文件 8、完整保存表数据,支持同名表,不支持同名文件域 注意: 1、特别注意Form一定要加上enctype="multipart/form-data"属性,method属性值必须是post,否则上传会出错 2、request.form()方法获取数据失效,请使用UpLoad.forms() 3、上传前请确认保存文件的文件夹有读写权限,若不可写则会出现"文件无法写入"错误,解决方法 http://dev.mo.cn/show.asp?id=81 二、调用方法 1、无组件类的调用方法: Dim Upload set Upload = new AnUpLoad 2、组件的调用方法: Dim Upload Set Upload = server.CreateObject("Anasp.Anupload") 注意:上传属性的设置必须在调用Upload.GetData()之前。 简调用示例: Dim Upload set Upload=new AnUpLoad 'Set Upload = server.CreateObject("Anasp.Anupload") Upload.SingleSize=1024*1024*1024 '设置个文件最大上传限制,按字节计;默认为不限制 Upload.MaxSize=1024*1024*1024 '设置最大上传限制,按字节计;默认为不限制 Upload.Exe="bmp|rar|pdf|jpg|gif" '设置合法扩展名,以|分割 Upload.Charset="gb2312" '设置文本编码,默认为gb2312 Upload.openProcesser=false '禁止进度条功能,如果启用,需配合客户端程序 Upload.GetData() '获取并保存数据,必须调用本方法
无组件ASP文件上传代码 记得在建立一个文件夹"updata" saveannounce_upload.asp 上传页 ------------------------------------ body {font-size:9pt;} input {font-size:9pt;} 文件上传 文件 ------------------------------------ saveannouce_upfile.asp 保存文件到服务器 ------------------------------------ 文件上传 <% dim upload,file,formName,formPath set upload=new upload_5xSoft ''建立上传对象 formPath=upload.form("filepath") ''在目录后加(/) if right(formPath,1)"/" then formPath=formPath&"/" for each formName in upload.file ''列出所有上传了的文件 set file=upload.file(formName) ''生成一个文件对象 if file.filesize<100 then response.write "请先选择你要上传的文件 [ 重新上传 ]" response.end end if if file.filesize>500*1000 then '设置上传文件大小为500K response.write "文件大小超过了限制 500K [ 重新上传 ]" response.end end if if file.FileSize>0 then ''如果 FileSize > 0 说明有文件数据 file.SaveAs Server.mappath("updata\"&file.FileName) ''保存文件 end if set file=nothing next set upload=nothing response.write "文件上传成功 [ 继续上传 ]" %> ------------------------------------ upload.inc 建立upload对象 ------------------------------------ dim upfile_5xSoft_Stream Class upload_5xSoft dim Form,File,Version Private Sub Class_Initialize dim iStart,iFileNameStart,iFileNameEnd,iEnd,vbEnter,iFormStart,iFormEnd,theFile dim strDiv,mFormName,mFormValue,mFileName,mFileSize,mFilePath,iDivLen,mStr Version="" if Request.TotalBytes<1 then Exit Sub set Form=CreateObject("Scripting.Dictionary") set File=CreateObject("Scripting.Dictionary") set upfile_5xSoft_Stream=CreateObject("Adodb.Stream") upfile_5xSoft_Stream.mode=3 upfile_5xSoft_Stream.type=1 upfile_5xSoft_Stream.open upfile_5xSoft_Stream.write Request.BinaryRead(Request.TotalBytes) vbEnter=Chr(13)&Chr(10) iDivLen=inString(1,vbEnter)+1 strDiv=subString(1,iDivLen) iFormStart=iDivLen iFormEnd=inString(iformStart,strDiv)-1 while iFormStart 0 and iFileNameStartiStart then mFileSize=iEnd-iStart-4 else mFileSize=0 end if set theFile=new FileInfo theFile.FileName=getFileName(mFileName) theFile.FilePath=getFilePath(mFileName) theFile.FileSize=mFileSize theFile.FileStart=iStart+4 theFile.FormName=FormName file.add mFormName,theFile else iStart=inString(iEnd+1,vbEnter&vbEnter) iEnd=inString(iStart+4,vbEnter&strDiv) if iEnd>iStart then mFormValue=subString(iStart+4,iEnd-iStart-4) else mFormValue="" end if form.Add mFormName,mFormValue end if iFormStart=iformEnd+iDivLen iFormEnd=inString(iformStart,strDiv)-1 wend End Sub Private Function subString(theStart,theLen) dim i,c,stemp upfile_5xSoft_Stream.Position=theStart-1 stemp="" for i=1 to theLen if upfile_5xSoft_Stream.EOS then Exit for c=ascB(upfile_5xSoft_Stream.Read(1)) If c > 127 Then if upfile_5xSoft_Stream.EOS then Exit for stemp=stemp&Chr(AscW(ChrB(AscB(upfile_5xSoft_Stream.Read(1)))&ChrB(c))) i=i+1 else stemp=stemp&Chr(c) End If Next subString=stemp End function Private Function inString(theStart,varStr) dim i,j,bt,theLen,str InString=0 Str=toByte(varStr) theLen=LenB(Str) for i=theStart to upfile_5xSoft_Stream.Size-theLen if i>upfile_5xSoft_Stream.size then exit Function upfile_5xSoft_Stream.Position=i-1 if AscB(upfile_5xSoft_Stream.Read(1))=AscB(midB(Str,1)) then InString=i for j=2 to theLen if upfile_5xSoft_Stream.EOS then inString=0 Exit for end if if AscB(upfile_5xSoft_Stream.Read(1))AscB(MidB(Str,j,1)) then InString=0 Exit For end if next if InString0 then Exit Function end if next End Function Private Sub Class_Terminate form.RemoveAll file.RemoveAll set form=nothing set file=nothing upfile_5xSoft_Stream.close set upfile_5xSoft_Stream=nothing End Sub Private function GetFilePath(FullPath) If FullPath "" Then GetFilePath = left(FullPath,InStrRev(FullPath, "\")) Else GetFilePath = "" End If End function Private function GetFileName(FullPath) If FullPath "" Then GetFileName = mid(FullPath,InStrRev(FullPath, "\")+1) Else GetFileName = "" End If End function Private function toByte(Str) dim i,iCode,c,iLow,iHigh toByte="" For i=1 To Len(Str) c=mid(Str,i,1) iCode =Asc(c) If iCode255 Then iLow = Left(Hex(Asc(c)),2) iHigh =Right(Hex(Asc(c)),2) toByte = toByte & chrB("&H"&iLow) & chrB("&H"&iHigh) Else toByte = toByte & chrB(AscB(c)) End If Next End function End Class Class FileInfo dim FormName,FileName,FilePath,FileSize,FileStart Private Sub Class_Initialize FileName = "" FilePath = "" FileSize = 0 FileStart= 0 FormName = "" End Sub Public function SaveAs(FullPath) dim dr,ErrorChar,i SaveAs=1 if trim(fullpath)="" or FileSize=0 or FileStart=0 or FileName="" then exit function if FileStart=0 or right(fullpath,1)="/" then exit function set dr=CreateObject("Adodb.Stream") dr.Mode=3 dr.Type=1 dr.Open upfile_5xSoft_Stream.position=FileStart-1 upfile_5xSoft_Stream.copyto dr,FileSize dr.SaveToFile FullPath,2 dr.Close set dr=nothing SaveAs=0 end function End Class
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

klxtx1234

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值