Подтвердить что ты не робот

Запись объекта MemoryStream в ответ

Я использую следующий код для потока pptx, который находится в объекте MemoryStream, но когда я его открываю, я получаю сообщение Repair в PowerPoint, что является правильным способом записи MemoryStream в объект ответа?

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();
4b9b3361

Ответ 1

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

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();

Ответ 2

Вместо создания презентации PowerPoint в MemoryStream напишите ее непосредственно в Response.OutputStream. Таким образом, вам не нужно тратить впустую какую-либо память на сегмент, поскольку компонент будет напрямую передавать поток в сетевой поток сокетов. Поэтому вместо передачи MemoryStream в функцию, генерирующую эту презентацию, просто передайте Response.OutputStream.

Ответ 3

Предполагая, что вы можете получить 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);
}

Это копия и вставка из моего рабочего кода, поэтому тип содержимого может не быть тем, что вы ищете, но запись потока в ответ - это трюк в последней строке.

Ответ 4

Попробуйте с этим

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();

Ответ 5

Сначала нам нужно записать в наш поток памяти, а затем с помощью метода Memory 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.

Ответ 6

Я пробовал все варианты end, close, flush и System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(), и никто из них не работал.

Затем я добавил длину содержимого в заголовок: Response.AddHeader( "Content-Length", asset.File_Size.ToString());

В этом примере актив - это класс, который имеет Int32 с именем File_Size

Это сработало для меня, и больше ничего не было.

Ответ 7

У меня была такая же проблема. попробуйте это: скопируйте в 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();