欢迎光临
我们一直在努力

ASP无组件上传的原理

没有组件上传一直是困扰你的问题。实际上,原理很简单,核心是分析字符串。但是,在实际操作中,这是非常困难的。关键问题是人们往往没有对原理进行深入分析,或者因为过程过于繁琐。客户端HTML使用post form方法上传文件。要查看上传的附件,我们会传递< input type="文件"> element,但一定要将表单的enctype属性设置为“multipart/form-data”;在后台asp程序中,很容易获得表单提交的ASCII数据。但是,如果需要获取上载的文件,则必须使用Request对象的BinaryRead方法进行读取。 BinaryRead方法是当前输入流中指定字节数的二进制读取。值得注意的是,一旦使用BinaryRead方法,就不能再使用Request.Form或Request.QueryString集合。结合Request对象的TotalBytes属性,所有表单提交的所有数据都可以是二进制的,但数据是经过编码的。首先让我们来看看数据是如何编码的。有什么规则要遵循吗?编辑代码。在代码中,我们将BinaryRead读取的二进制文件转换为文本并在upload.asp的后台输出(注意此示例不上传大文件,否则可能导致浏览器死机)。为了实时反映进度条,其实质是实时了解当前服务器获取了多少数据。回想一下,我们实现了上传过程,我们通过Request.BinaryRead(Request.TotalBytes)实现,我们无法知道当前服务器在请求过程中获得了多少数据。
所以我们只能通过灵活的方法来工作。如果我们可以将获取的数据分成几部分,那么我们可以根据已上传的块数计算当前上传的数量!换句话说,如果I 1K是1个块,则上传1MB的输入流被分成1024个块来获取。例如,我已经获得了100个块,这意味着我已经上传了100K。当我提议阻止时,许多人这是令人难以置信的,因为他们忽略了BinaryRead方法,它不仅读取指定的大小,而且还连续读取它。请求数据通过Request.BinaryRead获得。分离上传文件后,保存模式因数据类型而异:对于二进制数据,二进制流可以直接通过ADODB.Stream对象的SaveToFile方法保存为文件。对于文本数据,可以通过TextStream对象的Write方法将文本数据保存到文件中。对于文本数据和二进制数据,可以方便地相互转换。对于上传小文件,两者基本没有区别。但是,在以两种方式保存时仍存在一些差异。对于ADODB.Stream对象,必须先加载所有数据,然后才能将其保存为文件。因此,如果上传大文件,它将占用内存,但对于TextStream对象,在创建文件后,您可以编写一个零件并多次写入。这具有不占用服务器存储空间的优点。结合上面提到的块分析来获得数据原理,我们可以在每次获取上传数据时将其写入文件。在。我做过实验,同一台机器上传的文件超过200 MB,使用第一种方式内存一直在上升,到最后直接提示电脑虚拟内存不足,最可恨的是即使进度条表示文件已上传,但最终仍未保存该文件。使用后一种方法,在上载过程中内存基本上没有变化。
原理基本上是清楚的,但实际的代码比这复杂得多。有许多问题需要考虑。最麻烦的部分是分析数据。对于获取的每个数据,有必要分析它是描述项,表单项还是上载文件,文件是否已上传和……我相信您还可以基于以上描述开发自己的强大的无组件上传组件。

未经允许不得转载:美国主机评论博客 » ASP无组件上传的原理

分享到:更多 ()