C# Memory Stream/OpenXML иногда добавляет дополнительные символы к имени файла

Я экспортирую файл Excel, используя OpenXML и MemoryStream, и иногда в путь к файлу добавляются дополнительные символы. Это происходит не каждый раз. Когда я впервые загружаю его в течение дня, кажется, что он работает нормально, но после нескольких запусков он начинает добавлять дополнительные символы. Я предполагаю, что есть проблема с утечкой памяти или буфером, но я недостаточно знаю об этом, чтобы исправить это.

Мой код:

using (var stream = new MemoryStream())
{                
     report.CreatePackage(stream);

     System.Web.HttpContext.Current.Response.Clear();
     System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
     System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=Report_" + DateTime.Now.ToShortDateString() + ".xlsx");
     stream.Position = 0;
     stream.CopyTo(System.Web.HttpContext.Current.Response.OutputStream);
     System.Web.HttpContext.Current.Response.Flush();
     System.Web.HttpContext.Current.Response.Close();
     System.Web.HttpContext.Current.Response.End();
 }  

В пути к файлу это будет выглядеть примерно так: Report_09_14_2016CAOFMLJL.xlsx, а не только отчет и дата.

Любая помощь будет оценена по достоинству.


person JRich    schedule 14.09.2016    source источник
comment
Вы знаете, что Response.Clear() не очищает заголовки? Скажем наоборот: вызов Response.ClearHeaders() в подходящем месте что-нибудь изменит в сторону счастливого конца?   -  person grek40    schedule 14.09.2016
comment
Похоже, что при первом запуске он все еще добавляет дополнительные символы, но каждый последующий раз после этого работает. Я не уверен, что это заголовки или почему это не работает в первый раз.   -  person JRich    schedule 14.09.2016
comment
Код не соответствует строке. Вы добавляете ".xlsx", но в результате есть расширение ".XLSX" (и это различие, вероятно, объясняет, почему добавляется "CAOFMLJL.XLSX").   -  person Sinatr    schedule 14.09.2016
comment
Извините, это была опечатка. Доволен сменой. Он отредактирован, чтобы отразить фактическое имя файла.   -  person JRich    schedule 14.09.2016
comment
На моей машине DateTime.Now.ToShortDateString() печатает 14/09/2016, я предполагаю, что это связано с настройками системы. Возможно, попробуйте вместо этого DateTime.Now.ToString(dd_MM_yyyy). Косая черта недопустима в именах файлов в Windows.   -  person Tsef    schedule 14.09.2016
comment
Кроме того, вы должны заключить имя файла в кавычки, и у вас неправильный тип MIME; тот, который вы используете, верен для xls, но для xlsx вы должны использовать application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.   -  person petelids    schedule 14.09.2016
comment
Ах этого не знал. Спасибо, петелиды.   -  person JRich    schedule 14.09.2016


Ответы (1)


На моей машине DateTime.Now.ToShortDateString() печатает 14/09/2016, я предполагаю, что это связано с настройками системы. Возможно, попробуйте это вместо этого (или любую другую форму, которая вам требуется):

DateTime.Now.ToString("dd_MM_yyyy")

Косая черта недопустима в именах файлов в Windows.

person Tsef    schedule 14.09.2016
comment
Я думаю, дело в этом. Я проверял его несколько десятков раз, и никаких дополнительных символов не добавлялось. Однако, похоже, он добавлял его только иногда, поэтому я проведу еще несколько тестов и отмечу это как ответ позже, если он не вернется. - person JRich; 14.09.2016