首页 新闻 会员 周边

如何判断文件下载完成

0
悬赏园豆:20 [已关闭问题]
<P><SPAN style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如何能够判断用户下载一个文件是否完全完成,完全下载完成后在数据库中更新,增加用户积分。</SPAN></P> <P><SPAN style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我最开始的实现是这样的:</SPAN></P> <P style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">Response.BufferOutput = <SPAN style="COLOR: blue">false</SPAN>;</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: #2b91af">FileStream</SPAN> fs = <SPAN style="COLOR: #2b91af">File</SPAN>.OpenRead(Server.MapPath(<SPAN style="COLOR: #a31515">"~/test1.zip"</SPAN>));</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">byte</SPAN>[] data = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: blue">byte</SPAN>[fs.Length];</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Read(data, 0, data.Length);</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Response.OutputStream.Write(data, 0, data.Length);</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Close();</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fs.Dispose();</SPAN></P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<SPAN style="FONT-FAMILY: 宋体">更新数据库</SPAN></P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">Response.BufferOutput </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">是设置不用等服务器处理完就开始就发送。</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">这样写当时用一个16M的文件测试,开始下载时数据库没有更新,等完全下载完成后发现数据库记录增加了一条。</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">后来突然发现了一个bug,如果文件特别小,只有几k到十几k的时候,用户点击后文件还没有开始下载,数据库就更新了。(这里应该是因为IE的文件下载窗口在弹出的时候会预读文件)</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">后来我测试发现,其实最开始的16M文件,如果客户端下载的时候速度限制比如大概10k </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman','serif'">–</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体"> 30k</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">左右,不停的刷新数据库,发现文件下到80%左右的时候,数据库就更新了。</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">于是我将上面的程序修改成:</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">int</SPAN> length = 1024;</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">byte</SPAN>[] data = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: blue">byte</SPAN>[length];</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">while</SPAN> (<SPAN style="COLOR: blue">true</SPAN>)</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; </SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">int</SPAN> read = fs.Read(data, 0, data.Length);</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">if</SPAN> (read &lt;= 0)</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">break</SPAN>;</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Response.OutputStream.Write(data, 0, data.Length);</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">采取循环读数据库的方法,读一点写一点,发现还是不行。我尝试把length改成极限1,也不行,问题依旧。</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">我又尝试修改为:</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; <SPAN style="COLOR: blue">int</SPAN> length = 1;</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">byte</SPAN>[] data = <SPAN style="COLOR: blue">new</SPAN> <SPAN style="COLOR: blue">byte</SPAN>[length];</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">while</SPAN> (<SPAN style="COLOR: blue">true</SPAN>)</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">int</SPAN> read = fs.Read(data, 0, data.Length);</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">if</SPAN> (read &lt;= 0)</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="COLOR: blue">break</SPAN>;</SPAN></P> <P style="TEXT-ALIGN: left" align=left><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.BinaryWrite(data);</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">还是不行。。。</SPAN></P> <P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 新宋体">我觉得程序的流程应该没有错,只是在我将流存入Response后,到客户端读取之间,似乎被什么东西预读了一下,IIS?代理?所以造成服务器端已经处理完,但是客户端还没有完全读完。在文件极小的情况下就出现了客户端还没有下,服务器就处理完了。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;不知道这个问题到底有没有解。。</SPAN></P>
steven zhan的主页 steven zhan | 初学一级 | 园豆:180
提问于:2008-07-18 12:17
< >
分享
其他回答(2)
0
你看这样行吗? 就是你肯定可以知道你文件的大小,然后根据下载的文件的大小和他比较,如果相等就说明下载完毕。
金鱼 | 园豆:1090 (小虾三级) | 2008-07-18 12:58
0
HTTP是一个非状态的协议 除非,你能接管HTTP Hander处理, 然后 在下载时, 客户端的每次请求,都自己处理, 这样或许还差不多 否则, 网站程序,基本不可能了,如果使用 什么控件代替还差不多,ActiveX或者Silverlight,Flash 什么的~ 当然,还有一个客户端程序
G yc {Son of VB.NET} | 园豆:2006 (老鸟四级) | 2008-07-18 14:21
0
没看明白和数据库有啥关系?
5207 | 园豆:9 (初学一级) | 2008-07-19 16:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册