При записи файла на HttpResponse файл повреждается.
Файлы, которые я пишу, перед записью сохраняются на диск. Я проверил, что сгенерированный / сохраненный файл в порядке, только при записи в ответ.
Я тестировал несколько типов файлов (text и excel) и получил ту же проблему.
При использовании Excel (openXML) файл открывается после того, как Excel исправляет его.
ошибка в файле при просмотре содержимого через блокнот:
System.Threading.ThreadAbortException: Thread was being aborted. at System.Threading.Thread.AbortInternal() at System.Threading.Thread.Abort(Object stateInfo) at System.Web.HttpResponse.AbortCurrentThread() at SPAM.WEB.Reports.Wrapper.LaunchQuarterlyReportDownload() in C:\Use......
Код, который я использую для записи файла:
string fileDownloadPath = GetConfigValue("FileUploadPath");
string filePath = fileDownloadPath + BUSINESS.Business.QuarterlyAuditReport.getRecentQuarter() + ".xlsx";
BUSINESS.Business.QuarterlyAuditReport.GetSpreadSheet(filePath);
FileInfo fileInfo = new FileInfo(filePath);
MemoryStream memStream = new MemoryStream();
File.Open(filePath, FileMode.Open).CopyTo(memStream);
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename = " + fileInfo.Name);
HttpContext.Current.Response.BinaryWrite(memStream.GetBuffer());
memStream.Dispose();
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
GetBuffer () получает весь буфер, а не действительное содержимое в буфере, поэтому он будет содержать конечный мусор. ToArray () - это один из способов обойти это или просто BinaryWrite (File.ReadAllBytes (...))
@Mike при использовании текстового файла (test.txt) и наличии «тестирования» в качестве содержимого файл становится поврежденным. System.Threading.ThreadAbortException: поток был прерван. в System.Threading.Thread.AbortInternal () в System.Threading.Thread.Abort (StateInfo объекта) в System.Web.HttpResponse.AbortCurrentThread ()
Это веб-формы? Веб-API? MVC?
Это проект веб-форм
Я думаю, что Алекс, вероятно, что-то понимает в своем комментарии. Исключения, вероятно, происходят из-за вызова Response.End (). Если я правильно помню, это реализовано путем выдачи исключения ThreadAbort.
@Mike, я пробовал ToArray () и File.ReadAll ..... и все равно получаю ту же ошибку на выходе
решено: произошла некоторая обработка ошибок верхнего уровня (плохая обработка ошибок), которая записывала ошибку в ответ (Response.Write (ex.ToString ()) ;. это привело к тому, что файл содержал трассировку стека из исключения.





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