当前位置: 代码迷 >> ASP.NET >> asp.net 下载文件Response.TransmitFile(filename)的同时记录文件被下载次数错误
  详细解决方案

asp.net 下载文件Response.TransmitFile(filename)的同时记录文件被下载次数错误

热度:6846   发布时间:2013-02-26 00:00:00.0
asp.net 下载文件Response.TransmitFile(filename)的同时记录文件被下载次数异常
C# code
 protected void Page_Load(object sender, EventArgs e)    {        if (!IsPostBack)        {            try            {                //Session["userid"] = "adminTest";  //下载文件页面不能用session                string userid = "";                userid = Request.QueryString["uid"].ToString().Trim();                string FileGuid = Request.QueryString["id"].ToString().Trim();                Guid guid = new Guid(FileGuid);                string FileServerPath = "";                FileServerPath = bllfile.GetFilePath(userid, guid).ServerPath;                if (FileServerPath == "")                {                    Response.Write("<font size=3 color=red>没有找到文件!</font>");                }                else                {                                        if (!SendFile(FileServerPath))                    {                       Response.Write("<font size=3 color=red>下载出错,请与管理员联系!</font>");                    }                    else                    {                        int k = 0;                        k = k + bllfile.Update(guid); //这里是去更新文件下载次数+1,但是文件越大下载的时间越长,这里就会多次执行,为什么,而不是只执行一次                        if (k < 1)                       {                           Response.Write("<font size=3 color=red>更新您的下载次数失败</font>");                        }                }            }            catch (Exception ex)            {                Common.LogManager.LogWrite("Inner_ResourceList_DownFile-->Page_Load", ex.ToString());                Response.Write("<font size=3 color=red>对不起,无法下载文件!</font>");            }            Response.End();        }    }    private bool SendFile(string filename)    {        bool check;        try        {            Response.Clear();            Response.ClearHeaders();            FileInfo f = new FileInfo(filename);            Response.ContentType = "application/octet-stream";            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");            Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.UrlPathEncode(f.Name));            Response.TransmitFile(filename);            check = true;        }        catch (Exception ex)        {            check = false;        }        return check;    }

   
k = k + bllfile.Update(guid); //这里是去更新文件下载次数+1,但是文件越大下载的时间越长,这里就会多次执行,为什么,而不是只执行一次,发现这个page_load里的东西好像是循环碰次执行,导致这一句多次执行。
难道是Response.TransmitFile(filename);导致的向客户发送数据会多次发送?

------解决方案--------------------------------------------------------
Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(FileName.Substring(FileName.LastIndexOf('/') + 1), System.Text.Encoding.GetEncoding("utf-8")));
Response.ContentType = "application/octet-stream";
Response.WriteFile("");
Response.End();
------解决方案--------------------------------------------------------
最近也遇到这个问题
直接IE保存下载没得问题 但是用迅雷这类软件就会出现
感觉可能这类软件有重链的情况

我解决的办法是分段下载 只有在最后一段的时候才保存至数据库
同时能解决 用户点取消不载不计算的问题
------解决方案--------------------------------------------------------
貌似就 这个方法 Response.TransmitFile(filename);

TransmitFile MSDN解释,将文件直接输入HTTP 输出流,不进行缓存

也就意味着,文件直接传送到客户端,而不是先缓存好整个文件 传送到客户端

因此如果文件过大,就会导致放松请求,以保持文件的下载

换成 response.writeFile() 试下

------解决方案--------------------------------------------------------
那你可以检测request的头里面有没有Range数据。
如果有range,就不要+1。
  相关解决方案