C#.NET文件下载仅适用于IE

时间:2013-07-04 07:53:06

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

我的网站中有一个页面,它在服务器上动态生成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类型,而不指定内容处理以在浏览器窗口中显示PDF,再次在Internet Explorer中完美运行,但不能在任何其他浏览器中完美运行。

在localhost上测试以及上传到服务器时都会出现问题。

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

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

3 个答案:

答案 0 :(得分:0)

这就是我的做法

    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()之前关闭或处理所有流。

答案 1 :(得分:0)

感谢您的帮助。

问题在于请等待对话页面,我在其他浏览器中进行了调试,他们都讨厌window.location(页面)所以我把它改成了window.open(页面),它运行正常。

不知道我是怎么错过的。

答案 2 :(得分:0)

你应该在创建文件时设置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>