服务器 判断 客户端 文件下载

引用: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?代理?所以造成服务器端已经处理完,但是客户端还没有完全读完。在文件极小的情况下就出现了客户端还没有下,服务器就处理完了。

转载于:https://www.cnblogs.com/sode/archive/2012/11/15/2771241.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值