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

作者:宝玉 时间:2010-04-24 16:01:00 

一、无组件上传的原理

我还是一点一点用一个实例来说明的吧,客户端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.aspxhome.com";)来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:
-----------------------------7d429871607fe
Content-Disposition: form-data; name="file1"; filename="G:\homepage.txt"
Content-Type: text/plain
宝玉:http://www.aspxhome.com
-----------------------------7d429871607fe
Content-Disposition: form-data; name="filename"
default filename
-----------------------------7d429871607fe--
可以看出来对于表单中的项目,是用过"-----------------------------7d429871607fe"这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息,例如:Content-Disposition: form-data; name="filename",在描述信息中,通过name="filename"可以知道表单项的name。如果有filename="G:\homepage.txt"这样的内容,说明是一个上传的文件,如果是一个上传的文件,那么枋鲂畔⒒岫嘁恍蠧ontent-Type: text/plain来描述文件的Content-Type。描述信息和主体信息之间是通过换行来分隔的。
嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的"-----------------------------7d429871607fe")是怎么知道的?每次上传这个边界值是不一样的,还好还好asp中可以通过Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form-data; boundary=---------------------------7d429871607fe",有了这个,我们不仅可以判断客户端的form中有无使用enctype="multipart/form-data"(如果没有使用,那么下面就没必要执行啦),还可以获取边界值boundary=---------------------------7d429871607fe。(注意:这里获取的边界值比上面的边界值开头要少"--",最好补充上。)
至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的函数来分离出来我们想要的数据。

标签:无组件,上传,进度条,asp
0
投稿

猜你喜欢

  • IE6与IE7的unshift 方法

    2010-01-19 13:59:00
  • 如何对MySQL数据库日志文件进行维护

    2009-02-04 13:23:00
  • ASP中类的详细介绍(class Property Get、Property Let)

    2008-02-20 19:18:00
  • 交互设计:简单

    2011-08-27 16:46:27
  • sql 自定义百分比转换小数函数代码

    2011-09-30 11:54:01
  • 学以致用 驳“ASP低能论”

    2007-09-30 13:01:00
  • 如何用css制作有趣的按钮

    2008-03-17 13:54:00
  • 登录与注册两者的距离

    2009-01-02 16:48:00
  • ASP 统计某字符串中“A”出现过的次数

    2010-08-12 10:17:00
  • 如何使用数据绑定控件实现不换页提交数据?

    2010-05-16 15:17:00
  • asp截取字符串方法

    2009-02-09 13:30:00
  • 选择什么样的DOCTYPE

    2007-05-31 09:32:00
  • 推荐:怎么用javascript进行拖拽

    2007-09-21 20:14:00
  • [译稿]Web 字体的未来

    2008-07-31 17:50:00
  • VS 2008的性能改进

    2007-10-07 21:42:00
  • 使用SQL Server时最容易忽略的21个问题

    2009-01-13 13:59:00
  • Web开发的改良

    2009-06-25 14:34:00
  • 巧妙的自关联运用

    2012-10-07 10:55:58
  • 日期垂直排列的两种技巧

    2009-08-28 12:38:00
  • MySQL表设计优化与索引 (八)

    2010-10-25 19:46:00
  • asp之家 网络编程 m.aspxhome.com