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
投稿

猜你喜欢

  • linux下mysql乱码问题的解决方案

    2024-01-26 11:28:06
  • Python实现高斯函数的三维显示方法

    2023-07-04 01:47:22
  • PHP设计模式 注册表模式(多个类的注册)

    2023-11-20 06:45:13
  • Python Pillow(PIL)库的用法详解

    2022-01-31 13:43:26
  • Python连接字符串过程详解

    2022-12-09 23:49:45
  • python调用DLL与EXE文件截屏对比分析

    2022-06-01 08:19:15
  • python tkiner实现 一个小小的图片翻页功能的示例代码

    2023-07-19 18:40:32
  • python web框架 django wsgi原理解析

    2021-11-21 02:44:59
  • go语言Timer计时器的用法示例详解

    2024-04-27 15:39:38
  • Python设计模式之建造者模式实例详解

    2021-07-13 17:37:03
  • python闭包和装饰器你了解吗

    2022-01-11 00:46:02
  • vue圆环百分比进度条组件功能的实现

    2024-06-07 15:19:57
  • Go语言调用Shell与可执行文件的实现

    2024-02-06 17:03:44
  • Python 文件数据读写的具体实现

    2023-07-08 12:15:06
  • Pandas如何将表格的前几行生成html实战案例

    2021-06-05 12:01:27
  • mysql根据json字段内容作为查询条件(包括json数组)检索数据

    2024-01-13 00:50:50
  • AJAX在GET中文的时候解决乱码的方法

    2007-11-04 13:04:00
  • MySQL中的连接查询(等值连接)

    2024-01-18 05:37:52
  • mysql中数据库覆盖导入的几种方式总结

    2024-01-19 22:26:33
  • Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)

    2023-12-23 19:32:54
  • asp之家 网络编程 m.aspxhome.com