Asp无组件上传进度条解决方案

2016-01-29 18:46 70 1 收藏

Asp无组件上传进度条解决方案,Asp无组件上传进度条解决方案

【 tulaoshi.com - ASP 】

 

出处:宝玉BLOG

一、无组件上传的原理
我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过<input type="file"元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":


<form method="post" action="upload.asp" enctype="multipart/form-data"
 <label
  <input type="file" name="file1" /
 </label
 <br /
 <input type="text" name="filename" value="default filename"/
 <br /
 <input type="submit" value="Submit"/
 <input type="reset" value="Reset"/
</form


在后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易。但是如果需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或 Request.QueryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有无什么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的upload.asp中(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
<%
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.Open
 RS.AddNew
  RS("mBinary").AppendChunk(biData)
 RS.Update
 BinaryToString = RS("mBinary").Value
 RS.Close
End Function
%


简单起见,上传一个最简单的文本文件(G:homepage.txt,内容为"宝玉:http://www.webuc.net")来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:

-----------------------------7d429871607fe
Content-Disposition: form-data; name="file1"; filename="G:homepage.txt"
Content-Type: text/plain
宝玉:http://www.webuc.net
-----------------------------7d429871607fe
Content-Disposition: form-data; name="filename"
default filename
-----------------------------7d429871607fe--

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/asp/)

可以看出来对于表单中的项目,是用过"-----------------------------7d429871607fe"这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息,例如:Content-Disposition: form-data; name="filename",在描述信息中,通过name="filename"可以知道表单项的name。如果有filename="G:homepage.txt"这样的内容,说明是一个上传的文件,如果是一个上传的文件,那么描述信息会多一行Content-Type: text/plain来描述文件的Content-Type。描述信息和主体信息之间是通过换行来分隔的。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/asp/)

嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的"-----------------------------7d429871607fe")是怎么知道的?每次上传这个边界值是不一样的,还好还好asp中可以通过Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form-data; boundary=---------------------------7d429871607fe",有了这个,我们不仅可以判断客户端的form中有无使用enctype="multipart/form-data"(如果没有使用,那么下面就没必要执行啦),还可以获取边界值boundary=---------------------------7d429871607fe。(注意:这里获取的边界值比上面的边界值开头要少"--",最好补充上。)

至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的函数来分离出来我们想要的数据。

二、分块上传,记录进度
要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那

来源:https://www.tulaoshi.com/n/20160129/1507253.html

延伸阅读
标签: Web开发
编写思路: 把本地文件在客户端通过base64编码以后发送目的地. 测试过程中,上传文件过大,导致超时不成功. 后来经过改善.把编码分段发送.测试20M成功 编写目的: 在传统的解决方案里面,一次一次选取上传可以.但是在碰到把数据库里文件路径读出来,并把这些文件上传到一个地方的时候就比较麻烦. 如果得到路径一个一个去找到用ftp当然也是可以的,...
标签: ASP
  "ASP 0115"是什么错误? 如果你的ASP报告0115 error,意思是“我不知道是什么原因引起这个错误” 0115 error引起的原因一般是由外部因素引起的。 在下面我列出了一些可能引起报0115 error的东东,并且也提出了一些供参考的解决办法: 1.文件或注册键的权限和证明引起 如果系统授权用户对一些自建组件,系统动态链接库(DLL)...
标签: ASP
  stimson(原作) 目前有很多无组件上传类,我大概看了一下,大多写的相当复杂,有的居然还只能传文本最关键的是没有10行代码以下的 :)我花了一个晚上时间研究了一下ADODB.Stream,并且用了6行代码实现了无组件上传: strFileName = Request.QueryString("file1") Set objStream = Server.CreateObject("ADODB.Stream") objStream.T...
标签: ASP
  关于无组件文件上传的文章已经很多了,所以在这里我不想再解释无组件文件上传的原理。在ASP中无法将二进制文件数据直接保存成文件,所以我们一般还是利用数据库来保存用户上传的文件。 1。数据库表结构(Access): UserID:Text(保存上传文件的用户ID) FileContentType:Text(用来保存上传文件的类型,eg:"Application/msword"...
标签: ASP
  以下代码没有规范,还有些功能没完成,有那位高手能把它修改一下,封装成类则更是造福大众,或者以后有时间我会做的。有任何错误或建议请一定要给我发E-mail:sobina@21cn.com,谢谢。 好了,少说多做,本示例在w2kServer,IIS5,SQL SERVER7中测试通过。 如有不明白的可到精华区查“图象”或“图片”关键字找到答案,或写信给我。 ...

经验教程

585

收藏

90
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部