web-dev-qa-db-fra.com

Écriture de MemoryStream dans un objet de réponse

J'utilise le code suivant pour diffuser pptx dans un objet MemoryStream, mais lorsque je l'ouvre, je reçois un message de réparation dans PowerPoint, quelle est la bonne façon d'écrire MemoryStream dans 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();
34
Ali

J'ai eu le même problème et la seule solution qui a fonctionné était:

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

En supposant que vous puissiez obtenir un Stream, FileStream ou MemoryStream par exemple, vous pouvez le faire:

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

C’est un copier-coller de certains de mes codes de travail. Le type de contenu n’est peut-être pas ce que vous recherchez, mais écrire le flux dans la réponse est l’astuce de la dernière ligne.

9
Ian Robertson

Au lieu de créer la présentation PowerPoint dans un MemoryStream, écrivez-la directement dans le Response.OutputStream. De cette façon, vous ne perdez pas de mémoire sur le serveur car le composant transmet directement la sortie au flux de socket réseau. Au lieu de transmettre un MemoryStream à la fonction générant cette présentation, transmettez simplement Response.OutputStream.

7
Darin Dimitrov

Essayez avec ça

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

Nous devons d’abord écrire dans notre flux de mémoire, puis avec l’aide de la méthode "WriteTo", nous pouvons écrire dans la réponse de la page comme indiqué dans le code ci-dessous.

   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 est le nom de fichier indiqué. Ce code rendra le fichier PDF généré téléchargeable en appelant un PopUp.

3
Deepak Kothari

J'ai essayé toutes les variantes de end, close, flush et System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest () et aucune d'entre elles n'a fonctionné.

Ensuite, j'ai ajouté la longueur du contenu à l'en-tête: Response.AddHeader ("Content-Length", asset.File_Size.ToString ());

Dans cet exemple, l'élément est une classe qui a un Int32 appelé File_Size.

Cela a fonctionné pour moi et rien d'autre n'a fait.

1
Norwood

J'ai eu le même problème .. .. essayer ceci: copier dans MemoryStream -> supprimer le fichier -> télécharger.

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();
0
Alexander SS

Le problème pour moi était que mon flux n'était pas défini sur l'origine avant le téléchargement. 

Response.Clear();
Response.ContentType = "Application/msword";
Response.AddHeader("Content-Disposition", "attachment; filename=myfile.docx");

//ADDED THIS LINE
myMemoryStream.Seek(0,SeekOrigin.Begin);

myMemoryStream.WriteTo(Response.OutputStream); 
Response.Flush();
Response.Close();
0
Ryan Bennett