“从服务器收到的重复标头”在Chrome 16中使用EPPlus 2.9时出现错误

时间:2012-01-26 07:03:03

标签: asp.net excel google-chrome epplus

我正在玩EPPlus 2.9因为某些原因我尝试使用Chrome 16下载单Duplicate headers received from server个文件时出现.xlsx错误(在IE9中工作正常)

我正在使用this tutorial,我已将问题缩小到这行代码:

        Response.AppendHeader("Content-Disposition",
        "attachment; " +
        "filename=\"ExcelReport.xlsx\"; " +
        "size=" + fileBytes.Length.ToString() + "; " +
        "creation-date=" + DateTime.Now.ToString("R") + "; " +
        "modification-date=" + DateTime.Now.ToString("R") + "; " +
        "read-date=" + DateTime.Now.ToString("R"));

我的使用者:

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7

我在this Chrome forum page上看到Chrome在,标题中不喜欢逗号(Content-Disposition),应该用分号(;)替换。

有人有任何想法或得到同样的错误?

2 个答案:

答案 0 :(得分:9)

我很笨,DateTime.Now.ToString("R")产生Thu, 26 Jan 2012 02:05:44 GMT

我通过这样做来修复它:

String timestamp_without_commas = DateTime.Now.ToString("R").Replace(",","");

Response.AppendHeader("Content-Disposition",
    "attachment; " +
    "filename=\"ExcelReport.xlsx\"; " +
    "size=" + fileBytes.Length.ToString() + "; " +
    "creation-date=" + timestamp_without_commas + "; " +
    "modification-date=" + timestamp_without_commas + "; " +
    "read-date=" + timestamp_without_commas);

我已经习惯了IE变得暴躁而且Chrome玩得很好......

答案 1 :(得分:0)

 /// <summary>
        /// ExportToExcel is a method used for Export To Excel with template file.
        ///
        /// </summary>
        /// <param name="templateFile">The fully qualified name of the new file, or the relative file name. Do not end the path with the directory separator character.</param>
        /// <param name="dt">Datatable for export.</param>
        /// <param name="printHeaders">Datatable's header used or not, when Export it. </param>
        /// <param name="exportFileName">provide fileName only not path. </param>
        /// <param name="Response">System.Web.HttpResponse. </param>
        /// <param name="sheetNames">arg[0] means provide sheet name where you want to load data. \n (Optional Parameter) arg[1] means provide sheet name where you want to edit. (Optional Parameter) arg[2] means if your intention is to Edit sheet so provide searchText.</param>
        /// 
        public static string ExportToExcel(FileInfo templateFile, DataTable dt, bool printHeaders, string exportFileName, System.Web.HttpResponse Response, params String[] sheetNames)
        {
            try
            {
                using (ExcelPackage p = new ExcelPackage(templateFile, false))
                {
                    EPPlus.AddSheetWithTemplate(p, dt, sheetNames[0], printHeaders);


                    String[] clientName = exportFileName.Split(new char[] { '_' }, 2);

                    if (sheetNames.Count() > 2)
                    {
                        ExcelPackagePlusLibrary.EPPlus.EditSheet(p, sheetNames[1], sheetNames[2], clientName[0] ?? exportFileName);
                    }

                    Byte[] fileBytes = p.GetAsByteArray(); //Read the Excel file in a byte array

                    //Clear the response
                    Response.ClearHeaders();
                    Response.ClearContent();
                    Response.Clear();

                    //Response.Cookies.Clear();


                    //Add the header & other information
                    //Response.Cache.SetCacheability(System.Web.HttpCacheability.Private);
                    //Response.CacheControl = "private";
                    //Response.Charset = System.Text.UTF8Encoding.UTF8.WebName;
                    //Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
                    //Response.AppendHeader("Content-Length", fileBytes.Length.ToString());
                    //Response.AppendHeader("Pragma", "cache");
                    //Response.AppendHeader("Expires", "60");
                    Response.AddHeader("Content-Disposition",
                    "attachment; " +
                    "filename=" + exportFileName + "; " +
                    "size=" + fileBytes.Length.ToString() + "; " +
                    "creation-date=" + DateTime.Now.ToString("R").Replace(",", "") + "; " +
                    "modification-date=" + DateTime.Now.ToString("R").Replace(",", "") + "; " +
                    "read-date=" + DateTime.Now.ToString("R").Replace(",", ""));

                    //Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    Response.ContentType = "application/x-msexcel";

                    //Write it back to the client
                    Response.BinaryWrite(fileBytes);
                    Response.Flush();
                    Response.Close();

                    /* Download to Client Side. */
                    //DirectoryInfo dir = new DirectoryInfo(Server.MapPath("~/Testing/Downloaded/" + DateTime.Now.ToString("MM-dd-yyyy")));
                    //if (!dir.Exists)
                    //{
                    //    dir.Create();
                    //}
                    //File.WriteAllBytes(dir.FullName + "\\" + fileName, fileBytes);

                    return String.Empty;
                }
            }
            catch (Exception ex)
            {
                _ErrorMessage = ex.Message.ToString();
                return _ErrorMessage;
            }
        }