Запись объекта MemoryStream в ответ
Я использую следующий код для streamа pptx, который находится в объекте MemoryStream, но когда я его открываю, я получаю сообщение Repair в PowerPoint, что является правильным способом записи MemoryStream в объект Response?
HttpResponse response = HttpContext.Current.Response; response.Clear(); response.AppendHeader("Content-Type", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.pptx;", getLegalFileName(CurrentPresentation.Presentation_NM))); response.BinaryWrite(masterPresentation.ToArray()); response.End();
- Как получить код ответа HTTP с помощью Selenium WebDriver
- .NET: Самый простой способ отправить POST с данными и прочитать ответ
- Правильный способ возврата JSON с помощью узла или Express
- ASP.NET Как передать файл пользователю
- Возврат кода статуса http из Web Api controller
- Использование контента в заголовке ответа HTTP
- Разница между заголовками Pragma и Cache-control?
- Почему я должен использовать IHttpActionResult вместо HttpResponseMessage?
- Как установить тайм-аут HttpResponse для Android в Java
- Как реализовать правильную обработку ошибок HTTP в .NET MVC 2?
- Как распечатать возвращенное сообщение от HttpResponse?
- Какие заголовки HTTP-ответа необходимы
- jQuery - получить заголовки ответов AJAX
У меня была та же проблема, и единственным решением, которое сработало, было:
Response.Clear(); Response.ContentType = "Application/msword"; Response.AddHeader("Content-Disposition", "attachment; filename=myfile.docx"); Response.BinaryWrite(myMemoryStream.ToArray()); // myMemoryStream.WriteTo(Response.OutputStream); //works too Response.Flush(); Response.Close(); Response.End();
,Response.Clear(); Response.ContentType = "Application/msword"; Response.AddHeader("Content-Disposition", "attachment; filename=myfile.docx"); Response.BinaryWrite(myMemoryStream.ToArray()); // myMemoryStream.WriteTo(Response.OutputStream); //works too Response.Flush(); Response.Close(); Response.End();
Предполагая, что вы можете получить Stream, FileStream или MemoryStream, например, вы можете сделать это:
Stream file = [Some Code that Gets you a stream]; var filename = [The name of the file you want to user to download/see]; if (file != null && file.CanRead) { context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); context.Response.ContentType = "application/octet-stream"; context.Response.ClearContent(); file.CopyTo(context.Response.OutputStream); }
Это копия и вставка из моего рабочего кода, поэтому тип содержимого может не быть тем, что вы ищете, но запись streamа в ответ – это трюк в последней строке.
Вместо создания презентации PowerPoint в MemoryStream напишите ее непосредственно в Response.OutputStream
. Таким образом, вам не нужно тратить впустую какую-либо память на сегмент, поскольку компонент будет напрямую передавать stream в сетевой stream сокетов. Поэтому вместо передачи MemoryStream функции, генерирующей эту презентацию, просто передайте Response.OutputStream.
Попробуйте с этим
Response.Clear(); Response.AppendHeader("Content-Type", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.pptx;", getLegalFileName(CurrentPresentation.Presentation_NM))); Response.Flush(); Response.BinaryWrite(masterPresentation.ToArray()); Response.End();
,Response.Clear(); Response.AppendHeader("Content-Type", "application/vnd.openxmlformats-officedocument.presentationml.presentation"); Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}.pptx;", getLegalFileName(CurrentPresentation.Presentation_NM))); Response.Flush(); Response.BinaryWrite(masterPresentation.ToArray()); Response.End();
Сначала нам нужно записать в наш stream памяти, а затем с помощью метода streamа памяти «WriteTo» мы можем записать ответ на страницу, как показано в приведенном ниже коде.
MemoryStream filecontent = null; filecontent =//CommonUtility.ExportToPdf(inputXMLtoXSLT);(This will be your MemeoryStream Content) Response.ContentType = "image/pdf"; string headerValue = string.Format("attachment; filename={0}", formName.ToUpper() + ".pdf"); Response.AppendHeader("Content-Disposition", headerValue); filecontent.WriteTo(Response.OutputStream); Response.End();
FormName – это имя_файла, данный код будет делать сгенерированный PDF-файл загружаемым путем вызова PopUp.
Я пробовал все варианты end, close, flush и System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest (), и никто из них не работал.
Затем я добавил длину содержимого в заголовок: Response.AddHeader («Content-Length», asset.File_Size.ToString ());
В этом примере актив – это class, который имеет Int32, называемый File_Size
Это сработало для меня, и ничего больше.
Я была такая же проблема. попробуйте это: скопируйте в MemoryStream -> удалить файл -> скачать.
string absolutePath = "~/your path"; try { //copy to MemoryStream MemoryStream ms = new MemoryStream(); using (FileStream fs = File.OpenRead(Server.MapPath(absolutePath))) { fs.CopyTo(ms); } //Delete file if(File.Exists(Server.MapPath(absolutePath))) File.Delete(Server.MapPath(absolutePath)) //Download file Response.Clear() Response.ContentType = "image/jpg"; Response.AddHeader("Content-Disposition", "attachment;filename=\"" + absolutePath + "\""); Response.BinaryWrite(ms.ToArray()) } catch {} Response.End();