【问题标题】:C#.NET File download only works in IEC#.NET 文件下载仅适用于 IE
【发布时间】:2013-07-04 07:53:05
【问题描述】:

我的站点中有一个页面,它在服务器上动态生成 PDF 报告,同时向用户浏览器显示“请稍候”消息。完成后,它将唯一的文件路径放入会话中,然后打开 download.aspx,这是一个空白栏,page_load 函数中的以下 c# 代码。

    string fileUID = (string)(Session["fileUID"]);
        string FilePath = @fileUID;
        byte[] fileBytes = System.IO.File.ReadAllBytes(FilePath);
        string sFileName = "Report.pdf";

        System.Web.HttpContext context = System.Web.HttpContext.Current;
        context.Response.Clear();
        context.Response.ClearHeaders();
        context.Response.ClearContent();
        context.Response.AppendHeader("content-length", fileBytes.Length.ToString());
        context.Response.ContentType = "application/octet-stream";
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + sFileName);
        context.Response.BinaryWrite(fileBytes);
        context.Response.Flush();
        System.IO.File.Delete(FilePath);
        context.ApplicationInstance.CompleteRequest();

在 IE 中,这会打开下载对话框,允许用户下载文件。但是在 chrome、firefox 和 safari 中,它只是永远位于请等待页面上......

我还尝试为 PDF 文件指定 mime 类型,而不是指定 content-disposition 以使 PDF 显示在浏览器窗口中,再次在 Internet Explorer 中完美运行,但在任何其他浏览器中都没有。

在本地主机上测试和上传到服务器时都会出现此问题。

我在这里和更广阔的世界都进行了搜索,似乎找不到其他人有同样的问题。

请有人告诉我我的方式的错误。

【问题讨论】:

  • 是客户端上的请稍候对话框。你有可以给我们看的代码吗?
  • 查看实际发出的网络请求。发布的代码可能无关紧要 - 我怀疑 FF/Chrome never make 在“请稍候..”之后的次要请求。
  • pdf 是在浏览器中显示还是在 Acrobat Reader 中显示取决于浏览器。在 IE 中,使用 acrobat 插件显示 PDF 文件是标准的,可能需要配置其他浏览器来执行此操作。 (哪种方法更好,当我的 PDF 下载显示在浏览器中时,我讨厌讨厌!!!
  • 谢谢大家,我的请等待页面中的功能不正确,因此建议它从未真正调用下载页面

标签: c# asp.net .net web-applications


【解决方案1】:

我就是这样做的

    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.ms-excel";//check your valid file type
    Response.AddHeader("Content-Disposition", "attachment;filename=" + targetFileName);
    Response.Charset = "";

    using (System.IO.StreamWriter writer = new StreamWriter(Response.OutputStream)
    {
        //writer.Write(contentBytes);
    }
    Response.Flush();
    Response.Close();
    Context.ApplicationInstance.CompleteRequest();

确保在调用 CompletedRequest() 之前关闭或处置所有流。

【讨论】:

  • 谢谢,我把上一页弄乱了,所以我的函数永远不会被调用
【解决方案2】:

感谢您的帮助。

问题出在请稍候对话页面上,我在其他浏览器中调试过,他们都讨厌 window.location(page),所以我将其更改为 window.open(page),它工作正常。

不知道我是怎么错过的。

【讨论】:

    【解决方案3】:

    您应该在创建文件时设置 cookie,如下所示:

     var cookie = new HttpCookie("fileDownloadToken", _token);
                        cookie.Expires = DateTime.Now.AddMinutes(10); 
                        cookie.Path = "/"; //Also set path
                        context.Response.AppendCookie(cookie);
    

    如果将其设置为预期值,则带有 jquery.cookie 插件的下一页将读取 cookie 值,然后使用 jquery blockui 解除对 ui 的阻止:

    <script type="text/javascript">
    
        var fileDownloadCheckTimer;
        function blockUIForDownload() {
            var token = '1357.11.22'; 
            $('#download_token_value').val(token);
           $.blockUI({
                message:$('#domMessage'),
                css: {
                    padding: 10,
                    margin: 0,
                    width: '30%',
                    top: '50%',
                    left: '35%',
    
                    textAlign: 'center',
                    color: '#000',
                    border: '3px solid #aaa',
                    backgroundColor: '#fff',
                    cursor: 'wait',
                }});
                fileDownloadCheckTimer = window.setInterval(function () {
                    var cookieValue = $.cookie('fileDownloadToken');
                    //alert(cookieValue);
                    if (cookieValue == token)
                        finishDownload();
                }, 1000);
        }
    
        function finishDownload() {
            window.clearInterval(fileDownloadCheckTimer);
            $.unblockUI();
            $.cookie('fileDownloadToken', null, { path: '/' });
    
        }
    
    </script>  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-12
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2014-10-26
      相关资源
      最近更新 更多