我在ProductcheckDetail.aspx页面放了一个<asp:LinkButton/> 后台事件就是将服务器上的一个txt文件用Response.WriteFile(filename)的方式将发送给浏览器.FF测试的时候一切OK.但是用IE测试,IE却是对服务器发给它的文件不理不睬.打开后居然是页面的源文件!内容和在IE中 右键->查看页面源代码的内容一模一样!但文件名很奇怪,是ProductcheckDetail.aspx!我的天哪,百思不得其解.FF全都正常啊!
有没人知道那该死的IE为什么会这么做?

解决方案 »

  1.   

    正常情况下,在生产环境服务器上,aspx、ascx等等文件中是没有源代码的,只有一行简单的文字说明。也就是说你使用vs发布网站时,首先要把第一个选项“允许修改此预编译网站”的勾去掉。因为你不需要在生产服务器上去修改和调试源代码。所以在生产服务器,这不是什么问题。对于你的问题,如果出现在开发机器上,很难直接定位具体的问题。首先你要设置断点看看程序有没有运行到那条Response.WriteFile(filename)语句,filename变量是否则正确,你是否设置了正确的Content-Disposition消息头,或者对于断点续传下载来说要设置Content-Type类型为application/octet-stream。
      

  2.   

    恩,可能你没理解到我说的意思.我不是说IE把ProductcheckDetail.aspx文件给下载下来了,只不过文件名是ProductcheckDetail.aspx  内容是和浏览器上的下载页面中 右键->查看页面源代码的内容一模一样。
    我在vs自带的开发服务器上测试了,代码全部都执了的。我也确定Response.WriteFile 里面的路径参数是在确的,文件是存在的.而且我将网站发布后(“允许修改此预编译网站”的勾去掉了的),挂到iis上,用IE再试,依然如此!
    我现在最苦恼的是不知道是什么原因。
    附上我的源代码吧,希望是我的源代码哪里错了,也好把这个问题解决了。
     protected void lbtnShowdoc_Click(object sender, EventArgs e)
        {
            string filename = this.docfilename.Text;
            string filepath = HttpContext.Current.Server.MapPath("~/images/files") + "\\";
            string fileType = filename.Substring(filename.Length - 3).ToLower();
            Response.ClearContent();
            Response.ClearHeaders();
            switch (fileType)
            {
                case "pdf":
                    Response.ContentType = "application/PDF";
                    break;
                case "doc":
                case "docx":
                    Response.ContentType = "application/msword";
                    break;
                case "xls":
                    Response.ContentType = "application/Vnd.ms-excel";
                    break;
                case "txt":
                    Response.ContentType = "text/plain";
                    break;
            }
            Response.HeaderEncoding = System.Text.UTF8Encoding.UTF8;
            string contentFilename = UsuallOperation.UrlEncoder.ToHexString("成品检验报告."+fileType);
            string userAgent = Request.UserAgent.ToUpper();
            string fileNameHead;
            if (userAgent.IndexOf("FIREFOX") > 0)
                fileNameHead = string.Format("attachment;filename*=utf8''{0}", contentFilename);
            else
                fileNameHead = string.Format("attachment;filename = {0}", contentFilename);
            Response.AddHeader("Content-Disposition", fileNameHead); 
            Response.WriteFile(filepath + filename);
            Response.Flush();
            Response.Close();
        }
     UsuallOperation.UrlEncoder.ToHexString("成品检验报告."+fileType)的作用是为了解决文件名乱码问题的。另,用IE测试下载功能时,文件下载对话框中显示的文件名为"成品检验报告.txt"但是用迅雷下载后保存的文件名默认为ProductcheckDetail.aspx 。写到这里,我怀疑是不迅雷的问题,因为文件是用HTTP的形式发给浏览器的,迅雷也许获取不到。
      

  3.   

    试了下,果然是迅雷是作怪!
    用IE自带的功能下载,内容就正确了,只不IE这家伙显示的文件名依然是16进制的形式(%e6%XXXX.txt)鄙视下~
      

  4.   

    没有很好的跨浏览器的在http头中指定unicode文件名的方法,建议用url rewrite伪造一个文件url之外
      

  5.   

    为什么你不设置 Content-Disposition?
      

  6.   

    呵呵sorry,来看了一下你的代码,你设置了。文件名最好编码写为 HttpUtility.UrlEncode(context.Request.ContentEncoding.GetBytes(fileInfo.Name))