服务器 判断 客户端 文件下载
2012-11-15 11:40
267 查看
引用:http://www.cnblogs.com/jashin/articles/1245947.html
如何能够判断用户下载一个文件是否完全完成,完全下载完成后在数据库中更新,增加用户积分。
我最开始的实现是这样的:
Response.BufferOutput = false;
FileStream fs = File.OpenRead(Server.MapPath("~/test1.zip"));
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
Response.OutputStream.Write(data, 0, data.Length);
fs.Close();
fs.Dispose();
//更新数据库
Response.BufferOutput 是设置不用等服务器处理完就开始就发送。
这样写当时用一个16M的文件测试,开始下载时数据库没有更新,等完全下载完成后发现数据库记录增加了一条。
后来突然发现了一个bug,如果文件特别小,只有几k到十几k的时候,用户点击后文件还没有开始下载,数据库就更新了。(这里应该是因为IE的文件下载窗口在弹出的时候会预读文件)
后来我测试发现,其实最开始的16M文件,如果客户端下载的时候速度限制比如大概10k – 30k左右,不停的刷新数据库,发现文件下到80%左右的时候,数据库就更新了。
于是我将上面的程序修改成:
int length = 1024;
byte[] data = new byte[length];
while (true)
{
int read = fs.Read(data, 0, data.Length);
if (read <= 0)
break;
Response.OutputStream.Write(data, 0, data.Length);
}
采取循环读数据库的方法,读一点写一点,发现还是不行。我尝试把length改成极限1,也不行,问题依旧。
我又尝试修改为:
int length = 1;
byte[] data = new byte[length];
while (true)
{
int read = fs.Read(data, 0, data.Length);
if (read <= 0)
break;
Response.BinaryWrite(data);
}
还是不行。。。
我觉得程序的流程应该没有错,只是在我将流存入Response后,到客户端读取之间,似乎被什么东西预读了一下,IIS?代理?所以造成服务器端已经处理完,但是客户端还没有完全读完。在文件极小的情况下就出现了客户端还没有下,服务器就处理完了。
如何能够判断用户下载一个文件是否完全完成,完全下载完成后在数据库中更新,增加用户积分。
我最开始的实现是这样的:
Response.BufferOutput = false;
FileStream fs = File.OpenRead(Server.MapPath("~/test1.zip"));
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
Response.OutputStream.Write(data, 0, data.Length);
fs.Close();
fs.Dispose();
//更新数据库
Response.BufferOutput 是设置不用等服务器处理完就开始就发送。
这样写当时用一个16M的文件测试,开始下载时数据库没有更新,等完全下载完成后发现数据库记录增加了一条。
后来突然发现了一个bug,如果文件特别小,只有几k到十几k的时候,用户点击后文件还没有开始下载,数据库就更新了。(这里应该是因为IE的文件下载窗口在弹出的时候会预读文件)
后来我测试发现,其实最开始的16M文件,如果客户端下载的时候速度限制比如大概10k – 30k左右,不停的刷新数据库,发现文件下到80%左右的时候,数据库就更新了。
于是我将上面的程序修改成:
int length = 1024;
byte[] data = new byte[length];
while (true)
{
int read = fs.Read(data, 0, data.Length);
if (read <= 0)
break;
Response.OutputStream.Write(data, 0, data.Length);
}
采取循环读数据库的方法,读一点写一点,发现还是不行。我尝试把length改成极限1,也不行,问题依旧。
我又尝试修改为:
int length = 1;
byte[] data = new byte[length];
while (true)
{
int read = fs.Read(data, 0, data.Length);
if (read <= 0)
break;
Response.BinaryWrite(data);
}
还是不行。。。
我觉得程序的流程应该没有错,只是在我将流存入Response后,到客户端读取之间,似乎被什么东西预读了一下,IIS?代理?所以造成服务器端已经处理完,但是客户端还没有完全读完。在文件极小的情况下就出现了客户端还没有下,服务器就处理完了。
相关文章推荐
- web服务器如何判断客户端文件已下载结束?(php实现)
- Java Socket编程 文件传输(客户端从服务器下载一个文件)
- java方法客户端下载服务器上的文件到本地
- asp.net mvc导出excel文件先保存到服务器某个目录,然后再导出到客户端供客户下载功能的实现
- jsp从服务器下载xls文件到客户端
- java方法客户端下载服务器上的文件到本地
- 访问服务器地址中的某个文件链接,下载文件到客户端
- 判断是否下载指定客户端(遍历硬盘上的全部文件文件夹)
- C#网站开发----在服务器上生成临时文件,下载到客户端,然后删除临时文件
- 下载(二)客户端通过C# 代码直接从服务器下载文件到本地
- jsp从服务器下载xls文件到客户端
- nodejs:下载文件到服务器或客户端
- Java NIO 服务器与客户端实现文件下载
- 客户端下载服务器文件
- Java Socket编程 文件传输(客户端从服务器下载一个文件)
- 关于客户端下载文件而不是在服务器生成文件
- jsp实现从服务器下载xls文件到客户端的方法
- C#客户端直接从服务器下载文件到本地
- 简单文件下载服务器及客户端工具完工!
- 直接客户端浏览器下载文件,不必通过回传服务器再下载(例如将table内容导出excel)