Запись объекта 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(); 

У меня была та же проблема, и единственным решением, которое сработало, было:

 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(); 
  • Код состояния HTTP 0 - что это означает для выборки или XMLHttpRequest?
  • Interesting Posts

    boost.python не поддерживает параллелизм?

    Строковое значение для режима UnsafePointer

    Boost Spirit: «Семантические действия – это зло»?

    == Перегрузка для настраиваемого classа не всегда называется

    Запросить модуль, как правильно получить ударные символы?

    Создание видеороликов MP4, готовых для потоковой передачи HTTP

    Проводник Windows не открывает Мои документы, музыку или что-либо при нажатии на библиотеку?

    Помните расположение окон, когда они состыкованы и отстыкованы

    Добавить новый столбец между другими столбцами dataframe

    Что является лучшей библиотекой для синтаксического анализа XML в java

    Windows 7: Открывается незапечатанная буква диска

    Angularjs ui-router абстрактное состояние с разрешением

    Ubuntu автоматически монтирует диски NTFS в режиме только для чтения

    Как скомпилировать несколько исходных файлов java в командной строке

    Как синхронизировать фотографии с семьей?

    Давайте будем гением компьютера.