科技网

当前位置: 首页 >自媒体

ASP无组件上传的原理

自媒体
来源: 作者: 2019-04-05 23:55:25

无组件上传一直是困扰大家的一个问题。其实原理非常简单,核心就是分析字符串。不过,实际操作时,却困难重重。其中的关键问题还是大家常常对原理的剖析不够深入,或是由于进程过于繁琐。

客户端HTML使用post表单的方法上传文件,要阅读上传附件,我们通过 input type= file 元素,但是一定要注意必须设置form的enctype属性为 multipart/form-data 。

后台asp程序中,之前获取表单提交的ASCII 数据,非常的容易。但是如果需要获得上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用rm 或 eryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有没有甚么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的p中(注意该示例不要上传大文件,否则可能会造成浏览器死掉)。

要实时反映进度条,实质就是要实时知道当前服务器获得了多少数据?再回想一下我们实现上传的过程,我们是通过naryRead(talBytes)来实现的,在Request的进程中我们没法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那末上传1MB的输入流就分成1024块来获取,例如我当前已获得了100块,那末就表明当前上传了100K.当我提出分块的时候很多人觉得不可思议,由于他们都疏忽BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。

通过naryRead获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:对二进制数据,可以直接通过ream对象的SaveToFile方法,将二进制流保存成为文件。对文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文件中。

对文本数据和二进制数据,是可以方便的相互转换的,对上传小文件来讲,二者基本上没什么差别。但是两种方式保存时还是有一些差别的,对ream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对TextStream对象,可以在文件创建好后,一次Write一部分,分屡次Write,这样的好处是不会网络文章时间:2007-07-1405:08阅读:占用服务器内存空间,结合上面分析的分块获得数据原理,我们可以每获得一块上传数据就将之Write到文件中。我曾做过实验,同样本机上传一个200多MB的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即便进度条表示文件已上传完,但是终究文件还是没有保存上。而使用后一种方法,上传进程中内存基本上无甚么变化。

原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对每一块获得的数据,要分析是不是属于描写信息,是表单项目还是上传的文件,文件是不是已上传结束

相信根据上面的描写,您也可以开发出您自己功能强大的无组件上传组件。

Class UploadedFile

Public ContentType

Public FileName

Public FileData

Public Property Get FileSize()

FileSize = LenB(FileData)

End Property

Public Sub SaveToDisk(sPath)

Dim oFS, oFile

Dim nIndex

If sPath = Or FileName = Then Exit Sub

If Mid(sPath, Len(sPath)) \ Then sPath = sPath \

Set oFS = eateObject( leSystemObject )

If Not lderExists(sPath) Then Exit Sub

Set oFile = eateTextFile(sPath FileName, True)

For nIndex = 1 to LenB(FileData)

ite Chr(AscB(MidB(FileData,nIndex,1)))

Next

ose

End Sub

End Class

%

2006/7/5 17:16:47 支持(10)反对(4) 回复

%

Class FileUploader

Public File

Private Sub Class_Initialize()

Set File = eateObject( leSystemObject )

End Sub

Private Sub Class_Terminate()

set File=nothing

End Sub

Public Property Get Form(sIndex)

Form =

End Property

2006/7/5 17:12:23 支持(11)反对(8) 回复

上传最重要的因素是表单的METHOD为POST,且要求enctype标记为multipart/form-data,所以博主的代码,根本就连最基本的要素都没到达。

再分析一下博主的代码,关键代码是以下两句:

adFromFile strFileName

veToFile pPath(GetFileName(strFileName)),2

而这两句代码的第一句是从一个文件中载入内容,第二句则是写入到另一个文件中。

再看第一个文件的文件名是从哪儿来的呢?恰恰是从参数传递过来的。而博主的代码中根本就没从FORM提交过来的数据中取文件内容,而是根据传递过来的文件路径去读一个文件,所以这个功能在主机为localhost(也就是本机调试)的时候通过,而在正常的远程站上是没法实现的(由于根本上述两句代码中的第一句根本没法读到内容)。

2008/9/9 11:02:45 支持(6)反对(5) 回复

Private Function CByteString(sString)

Dim nIndex

For nIndex = 1 to Len(sString)

CByteString = CByteString ChrB(AscB(Mid(sString,nIndex,1)))

Next

End Function

Private Function CWideString(bsString)

Dim nIndex

CWideString =

For nIndex = 1 to LenB(bsString)

CWideString = CWideString Chr(AscB(MidB(bsString,nIndex,1)))

Next

End Function

End Class

2006/7/5 17:16:11 支持(5)反对(5) 回复

Else

nPos = InstrB(nPos, biData, CByteString(Chr(13)))

nPosBegin = nPos + 4

nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2

End If

nDataBoundPos = InstrB(nDataBoundPos + LenB(vDataBounds), biData, vDataBounds)

Loop

End Sub

2006/7/5 17:15:14 支持(7)反对(9) 回复

If nPosFile 0 And nPosFile nPosBound Then

Dim oUploadFile, sFileName

Set oUploadFile = New UploadedFile

nPosBegin = nPosFile + 10

nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(34)))

sFileName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPo微笑挂满两腮才是正道sBegin))

leName = Right(sFileName, Len(sFileName)-InStrRev(sFileName, \ ))

nPos = InstrB(nPosEnd, biData, CByteString( Content-Type: ))

nPosBegin = nPos + 14

nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13)))

ntentType = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin))

nPosBegin = nPosEnd+4

nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2

leData = MidB(biData, nPosBegin, nPosEnd-nPosBegin)

set File=oUploadFile

2006/7/5 17:14:38 支持(5)反对(12) 回复

(*)

验证(*)

肠胃敏感有什么症状
整肠生是什么药
整肠生需要放在冰箱里吗

相关推荐