c# - write - Escribir MemoryStream en Objeto de respuesta
httpresponse django (7)
Estoy usando el siguiente código para transmitir pptx que está en un objeto MemoryStream, pero cuando lo abro recibo un mensaje de Reparación en PowerPoint, ¿cuál es la forma correcta de escribir MemoryStream en Response Object?
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();
En lugar de crear la presentación de PowerPoint en un MemoryStream, escribirlo directamente en Response.OutputStream
. De esta forma, no necesita desperdiciar memoria en el servidor, ya que el componente transmitirá directamente la salida al flujo de conexión de red. Entonces, en lugar de pasar un MemoryStream a la función que está generando esta presentación simplemente pase el Response.OutputStream.
Prueba con esto
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();
Primero, necesitamos escribir en nuestro flujo de memoria y luego, con la ayuda del método Memory Stream "WriteTo", podemos escribir en la Respuesta de la página como se muestra en el siguiente código.
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 es el nombre de archivo dado. Este código hará que el archivo PDF generado se descargue al invocar un PopUp.
Intenté todas las variantes de end, close, flush y System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest () y ninguna de ellas funcionó.
Luego agregué la longitud del contenido al encabezado: Response.AddHeader ("Content-Length", asset.File_Size.ToString ());
En este ejemplo, el activo es una clase que tiene un Int32 llamado File_Size
Esto funcionó para mí y nada más lo hizo.
Tuve el mismo problema. intente esto: copie a MemoryStream -> eliminar archivo -> descargar.
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();
Tuve el mismo problema y la única solución que funcionó fue:
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();
Asumiendo que puede obtener un Stream, FileStream o MemoryStream por ejemplo, puede hacer esto:
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);
}
Es una copia y pega de algunos de mis códigos de trabajo, por lo que el tipo de contenido podría no ser lo que estás buscando, pero escribir el flujo en la respuesta es el truco de la última línea.