我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":
<form method="post" action="upload.asp" enctype="multipart/form-data"> <br> <label> <br> <input type="file" name="file1" /> <br> </label> <br> <br /> <br> <input type="text" name="filename" value="default filename"/> <br> <br /> <input type="submit" value="Submit"/> <br> <input type="reset" value="Reset"/> <br> </form>
后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易。但是如果需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或 Request.QueryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有无什么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的upload.asp中(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
<%Dim biData, PostDataSize = Request.TotalBytesbiData = Request.BinaryRead(Size)PostData = BinaryToString(biData,Size)Response.Write " <pre> " & PostData & " </pre> "
简单起见,上传一个最简单的文本文件(G:\homepage.txt,内容为"宝玉:http://www.webuc.net")来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:
'使用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.CloseEnd Function %>
二、分块上传,记录进度
要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那么就表明当前上传了100K。当我提出分块的时候很多人觉得不可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。
写个例子来验证一下分块读取的完整性,在刚才的例子基础上(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
<%Dim biData, PostData, TotalBytes, ChunkBytesChunkBytes = 1 * 1024
' 分块大小为1KTotalBytes = Request.TotalBytes
' 总大小PostData = ""
' 转化为文本类型后的数据ReadedBytes = 0
' 初始化为0
' 分块读取Do While ReadedBytes < TotalBytes biData = Request.BinaryRead(ChunkBytes)
' 当前块 PostData = PostData & BinaryToString(biData,ChunkBytes)
' 将当前块转化为文本并拼接 ReadedBytes = ReadedBytes + ChunkBytes
' 记录已读大小
If ReadedBytes > TotalBytes Then ReadedBytes = TotalBytesLoopResponse.Write " <pre> " & PostData & " </pre> "
' 使用pre,原样输出格式
' 将二进制流转化成文本
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.CloseEnd Function %>
安徽新华电脑学校专业职业规划师为你提供更多帮助【在线咨询】