我用的是风声ASP无组件上传图片,但路径无法写入excel数据表表?

关于风声无组件上传类 2.1
的大小,和上传类型的问题。_百度知道求ASP上传图片同时把图片路径写入数据库中?因为我不会请把代码写全!谢谢!_百度知道2984人阅读
长期以来,上传文件是ASP的一个难题。第三方组件上传速度快,但是需要在服务器端注册,而且有部分需要附加版权信息或付费使用,对大多数用户是可望不可及的事。网络上流传的一些无组件上传类,质量良莠不齐,在安全性设计上甚至存在一些漏洞,在性能方面,更是让用户望而却步。网标(Net Builder)经过长时间对上传算法的研究优化,开发出可与组件上传相媲美的ASP无组件上传类&&风声无组件上传类。经测试,该无组件上传类在性能上明显超过同类ASP无组件上传程序,接近甚至超过一些上传组件,安全性、易用性更优于同类程序。 UpLoadClass对象[对象参考]   使用UpLoadClass对象可以处理一个HTTP表单上传二进制数据(文件)到服务器,其形式模拟ASP内置对象Request。上传的处理要创建一个UpLoadClass对象实例,可以使用&%Set request2=new UpLoadClass%& 参数属性 MaxSize 每个上传文件的最大字节数 默认值:153600 特征值:0表示文件大小不受限制 FileType 允许上传的文件类型 默认值:"gif/jpg" 特征值:""表示文件类型不受限制(空)&&&&&SavePath 文件存放的路径,可以是相对路径 默认值:"" 即当前目录&&&&&AutoSave 设置Open方法处理文件的方式,对其他方法无效 默认值:0 可选值:   0:取无重复的服务器时间字符串为文件名自动保存文件   1:取源文件名自动保存文件   2:不自动保存文件,Open之后请用Save/GetData方法保存文件 方法 Sub Open() 打开对象,打开之前可以重定义对象参数属性MaxSize等 每个实例均需调用的方法。 Function Save(Item,Name) 保存文件,成功保存返回ture,否则返回false Item是表单中file元素 Name是保存的文件名,可选值:   0:自动取无重复的服务器时间字符串为文件名   1:自动取源文件名   字符串:自定义的文件名,如"mypic.jpg" Function Form(Item) 对于其他表单元素:(假设表单元素名为item)   Form(item)     表单元素对应的Value值 对于file表单元素:(假设表单元素名为item)   Form(item)     文件上传后的文件名   Form(item&"_Type") 文件类型,例"image/gif"   Form(item&"_Name") 原文件名   Form(item&"_Path") 原文件本地上传路径   Form(item&"_Size") 文件字节数   Form(item&"_Ext")  文件扩展名   Form(item&"_Err")  该文件上传状态     -1:没有文件上传     0:正常     1:文件超过大小     2:文件类型不正确     3:文件超过大小,类型不正确&&&&&&&&&&&&&&&& 4:文件保存失败对于images类file表单元素还有:(假设表单元素名为item)   Form(item&"_Width") 图片宽度   Form(item&"_Height")图片高度 Function GetData(Item) 获取数据流,可用来保存文件到数据库,试图获取非文件数据时返回空值 返回属性(只读) Version 返回类版本说明 Error 返回当前文件保存状态 -1:对象尚未打开,请先Open打开对象&&&0:正常 1:有文件超过大小 2:有文件类型不正确 3:有文件超过大小,类型不正确 4:异常退出 FormItem 保存Post表单中文本域名称的数组,下标从1开始 FileItem 保存Post表单中文件域名称的数组,下标从1开始
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2427758次
积分:23418
积分:23418
排名:第198名
原创:181篇
转载:623篇
评论:342条
(1)(2)(2)(1)(8)(2)(7)(1)(2)(4)(4)(16)(9)(19)(4)(3)(5)(8)(5)(1)(3)(1)(1)(2)(13)(2)(4)(7)(14)(15)(14)(1)(1)(4)(37)(18)(21)(6)(3)(10)(22)(34)(34)(24)(25)(9)(37)(21)(28)(22)(11)(3)(8)(8)(1)(6)(19)(6)(5)(9)(14)(15)(5)(3)(2)(5)(4)(6)(5)(9)(28)(67)(30)asp无组件上传为什么我引用无组件上传文件是他居然说我的代码错误 - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
asp无组件上传
上传文件是他居然说我的代码错误,
错误类型:
ADODB.Stream (0x800A0BB9)
参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
/admin/ p, 第 9 行
错无的第9行的代码是:updata.write request.BinaryRead(request.TotalBytes) 这句
&%
dim data,datalength,fstart,fend,tstart,tend,tinfo,flag,flaglen,tformname,tfile,tfilename,tfilepath,tfileext,sfilename
set formdata=server.CreateObject("Scripting.Dictionary")
set updata=server.CreateObject("ADODB.Stream")
set tmpdata=server.CreateObject("ADODB.Stream")
updata.Type=1'设置对象的数据类型为二进制数据
de=3'设置对象的打开模式为读写模式
updata.open'打开对象
updata.write request.BinaryRead(request.TotalBytes)
updata.position=0
data= ad
datalength= ze
tcrlf=chrb(13) & chrb(10)'回车符号代码
flag=leftb(data,instrb(data,tcrlf)-1)'获取每个表单项目数据之间的分隔符
fstart=lenb(flag)+2'搜索开始位置 加2是因为分隔符后有一个回车符号占两个字节
flaglen=fstart'分隔符长度,包含了后面的回车符
'循环处理表单元素
do
'分离出表单元素信息
即从开始查找位置到有两个回车符之间的信息
fend=instrb(fstart,data,tcrlf&tcrlf)+3
'初始化临时STREAM对象
tmpdata.type=1
tmpdata.open
'设置指针位置
updata.position=fstart
pyto tmpdata,fend-fstart'将元素表单信息复制到临时STREAM对象
fstart=instrb(fend,data,flag)-1'查找下一个分隔符所在位置
'fstart=instrb(fend,data,flag)
tmpdata.position=0
tmpdata.type=2'设置读取方式为文本
arset="gb2312"'设置编码方式为GB2312
tinfo= adtext
'取得表单元素的名称
tstart=instr(22,tinfo,"name=""")+6
tend=instr(tstart,tinfo,"""",1)
tformname=mid(tinfo,tstart,tend-tstart)
'取得表单元素的值
if instr(tstart,tinfo,"filename=""",1)&0 then '如果是文件
tmpdata.type=1
tmpdata.open
'取得文件属性
tstart=instr(tend,tinfo,"filename=""",1)+10
tend=instr(tstart,tinfo,"""",1)
tfile=mid(tinfo,tstart,tend-tstart)'得到文件全路径
if tfile&&"" then
tfilename=mid(tfile,instrrev(tfile,"\")+1)'得到文件名
tfilepath=left(tfile,instrrev(tfile,"\"))'得到文件路径
tfileext=mid(tfile,instrrev(tfile,".")+1)' 得到文件后缀
sfilename=GetRndFileName(tfileext)
'response.write tfilename & "&br&" & tfilepath & "&br&" & tfileext
'得到文件数据
updata.position=fend
pyto tmpdata,fstart-2-fend
vetofile server.MapPath("../upfile") & "\" & sfilename,2
d tformname,sfilename
'如果是表单元素
tmpdata.type=1
tmpdata.open
updata.position=fend'设置指针指向数据区域开始位置
pyto tmpdata,fstart-fend-2'复制数据到临时STREAM对象:复制长度为一下个分隔符开始位置-2 -2是因为要减掉最后的回车符长度
tmpdata.position=0
tmpdata.type=2
arset="gb2312"
d tformname, adtext
fstart=fstart+flaglen'得到下次搜索开始位置:分隔符开始位置加上分融符长度得到下次搜索开始位置
ose
loop while (fstart+2)&datalength'如果还没有到结尾
因为束标志是 -- 两个字节,所以这里要加2后再判断
set tmpdata=nothing
ose
set updata=nothing
' 取随机文件名
Function GetRndFileName(sExt)
一、无组件上传的原理
我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过&input type="file"&元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":
&form method="post" action=" p" enctype="multipart/form-data"&
&input type="file" name="file1" /&
&input type="text" name="filename" value="default filename"/&
&input type="submit" value="Submit"/&
&input type="reset" value="Reset"/&
&/form&
在后台asp程序中,以前获取表单提交的ASCII
一、无组件上传的原理
我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过&input type="file"&元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":
&form method="post" action=" p" enctype="multipart/form-data"&
&input type="file" name="file1" /&
&input type="text" name="filename" value="default filename"/&
&input type="submit" value="Submit"/&
&input type="reset" value="Reset"/&
&/form&
在后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易。但是如果需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或 Request.QueryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有无什么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的 p中(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
&%
Dim biData, PostData
Size = Request.TotalBytes
biData = Request.BinaryRead(Size)
PostData = BinaryToString(biData,Size)
Response.Write "&pre&" & PostData & "&/pre&"
'使用pre,原样输出格式
' 借助RecordSet将二进制流转化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = CreateObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS("mBinary").AppendChunk(biData)
BinaryToString = RS("mBinary").Value
RS.Close
End Function
简单起见,上传一个最简单的文本文件(G:\homepage.txt,内容为"宝玉: ")来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:
-----------------------------7dfe
Content-Disposition: form- name="file1"; filename="G:\homepage.txt"
Content-Type: text/plain
宝玉:
-----------------------------7dfe
Content-Disposition: form- name="filename"
default filename
-----------------------------7dfe--
可以看出来对于表单中的项目,是用过"-----------------------------7dfe"这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息,例如:Content-Disposition: form- name="filename",在描述信息中,通过name="filename"可以知道表单项的name。如果有filename="G:\homepage.txt"这样的内容,说明是一个上传的文件,如果是一个上传的文件,那么描述信息会多一行Content-Type: text/plain来描述文件的Content-Type。描述信息和主体信息之间是通过换行来分隔的。
嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的"-----------------------------7dfe")是怎么知道的?每次上传这个边界值是不一样的,还好还好asp中可以通过Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form- boundary=---------------------------7dfe",有了这个,我们不仅可以判断客户端的form中有无使用enctype="multipart/form-data"(如果没有使用,那么下面就没必要执行啦),还可以获取边界值boundary=---------------------------7dfe。(注意:这里获取的边界值比上面的边界值开头要少"--",最好补充上。)
至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的函数来分离出来我们想要的数据。
二、分块上传,记录进度
要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那么就表明当前上传了100K。当我提出分块的时候很多人觉得不可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。
写个例子来验证一下分块读取的完整性,在刚才的例子基础上(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
&%
Dim biData, PostData, TotalBytes, ChunkBytes
ChunkBytes = 1 * 1024
' 分块大小为1K
TotalBytes = Request.TotalBytes
' 总大小
PostData = ""
' 转化为文本类型后的数据
ReadedBytes = 0
' 初始化为0
' 分块读取
Do While ReadedBytes & TotalBytes
biData = Request.BinaryRead(ChunkBytes)
PostData = PostData & BinaryToString(biData,ChunkBytes) ' 将当前块转化为文本并拼接
ReadedBytes = ReadedBytes + ChunkBytes ' 记录已读大小
If ReadedBytes & TotalBytes Then ReadedBytes = TotalBytes
Loop
Response.Write "&pre&" & PostData & "&/pre&"
' 使用pre,原样输出格式
' 将二进制流转化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = CreateObject("ADODB.Recordset")
RS.Fields.Append "mBinary", adLongVarChar, Size
RS("mBinary").AppendChunk(biData)
BinaryToString = RS("mBinary").Value
RS.Close
End Function
试验一下上传刚才的文本文件,输出结果证明这样分块读取的内容是完整的,并且在While循环中,我们可以在每次循环时将当前状态记录到Application中,然后我们就可以通过访问该Application动态获取上传进度条。
另:上例中是通过字符串拼接的,如果是要拼接二进制数据,可以通过ADODB.Stream对象的Write方法,示例代码如下:
Set bSourceData = createobject("ADODB.Stream")
bSourceData.Open
bSourceData.Type = 1 'Binary
Do While ReadedBytes & TotalBytes
biData = Request.BinaryRead(ChunkBytes)
bSourceData.Write biData ' 直接使用write方法将当前文件流写入bSourceData中
ReadedBytes = ReadedBytes + ChunkBytes
If ReadedBytes & TotalBytes Then ReadedBytes = TotalBytes
Application("ReadedBytes") = ReadedBytes
Loop
三、保存上传的文件
通过Request.BinaryRead获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:
对于二进制数据,可以直接通过ADODB.Stream对象的SaveToFile方法,将二进制流保存成为文件。
对于文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文件中。
对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于ADODB.Stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对于TextStream对象,可以在文件创建好后,一次Write一部分,分多次Write,这样的好处是不会占用服务器内存空间,结合上面分析的分块获取数据原理,我们可以每获取一块上传数据就将之Write到文件中。我曾做过试验,同样本机上传一个200多MB的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。
四、未解决的难题
我在博客园上看到Bestcomy描述他的Asp.Net上传组件是可以和Sever.SetTimeOut无关的,而在Asp中我是没能做到,对于上传大文件,就只有将Server.SetTimeOut设置为一个很大的值才可以。不知道有没有比较好的解决方法。
如果我们在保存文件时,使用TextStream对象的Write方法,那么如果用户上传时中断了文件传输,已经上传的那部分文件还是在的,如果可以断点续传就好了。关键问题是Request.BinaryRead方法虽然可以分块读取,但是却不能跳过某一段读取!
五、结束语
原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对于每一块获取的数据,要分析是不是属于描述信息,是表单项目还是上传的文件,文件是否已经上传结束……
相信根据上面的描述,您也可以开发出您自己功能强大的无组件上传组件。我想更多的人关心的只是代码,而不会自己动手去写的,也许没有时间,也许水平还不够,更多的只是已经成为了一种习惯……我在CSDN上见过太多技术八股文——一段说明,然后全是代码。授人以鱼不若授人以渔,给你一个代码,也许你并不会去思考为什么,直接拿去用,当下次碰到类似的问题的时候,还是不知道为什么,希望此文能让更多人学到点什么,最重要是“悟”到点什么!
教你一个最简单的办法,设一个SESSION,和一个错误处理页面。把整个SELECT语话提交后到错误页面。让它全部显示出来。然后将SELECT语句拷贝到查询分析器...
大家还关注uploadClass 经典的风声无组件上传类,调用方便,很实用 WEB(ASP,PHP,...) 238万源代码下载-
&文件名称: uploadClass
& & & & &&]
&&所属分类:
&&开发工具: ASP
&&文件大小: 431 KB
&&上传时间:
&&下载次数: 10
&&提 供 者:
&详细说明:经典的风声无组件上传类,调用方便,很实用-From the classic sound of the wind-free component class, it is useful
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&风声无组件上传类\demo1\7891.jpg&&................\.....\1204.jpg&&................\.....\0610.jpg&&................\.....\3969.jpg&&................\.....\6485.jpg&&................\.....\1829.jpg&&................\.....\index.htm&&................\.....\Thumbs.db&&................\.....\upload.asp&&................\.....\_notes\dwsync.xml&&................\....2\index.htm&&................\.....\upload.asp&&................\....3\index.htm&&................\.....\upload.asp&&................\help\Code2Info.en.asp&&................\....\Code2Info.sc.asp&&................\....\help1.htm&&................\....\help2.htm&&................\index.htm&&................\speed\conn.asp&&................\.....\function.js&&................\.....\index.htm&&................\.....\uplist.asp&&................\.....\upload.asp&&................\.....\UpLoadClass.mdb&&................\.....\......File\Thumbs.db&&................\.tyle\default.css&&................\.....\_notes\dwsync.xml&&................\UpLoadClass.asp&&................\_notes\dwsync.xml&&................\demo1\_notes&&................\....3\UpLoadFile&&................\speed\UpLoadFile&&................\.tyle\_notes&&................\demo1&&................\demo2&&................\demo3&&................\help&&................\speed&&................\style&&................\_notes&&风声无组件上传类
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - ASP中一个很好的无组件文件上传工具,如果上传的是图片,在选择时还可以看到图片的面貌。
&[] - Asp无组件上传带进度条 .rar 绝对酷的东东!}

我要回帖

更多关于 excel数据表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信