C# mémoire de retour de flux d'OpenXML résultant d'un fichier word corrompu
J'ai un problème avec un MemoryStream de OpenXML. - Je réussir à l'ouverture d'un fichier Word, de le modifier et de le télécharger à travers le HttpResponse si je fais toutes les étapes d'une méthode unique.
Mais si j'essaie de le faire dans deux classes différentes (ou les méthodes) par le retour de la MemoryStream, j'obtiens un fichier word corrompu. J'ai pensé à une chasse d'eau ou un tampon de problème mais je ne trouve pas de solution.
Voici le code de travail :
public void FillTemplateOpenXmlWord(HttpResponse response)
{
string filePath = @"c:\template.docx";
byte[] filebytes = File.ReadAllBytes(filePath);
using (MemoryStream stream = new MemoryStream(filebytes))
{
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(stream, true))
{
//do some changes
...
myDoc.MainDocumentPart.Document.Save();
}
string docx = "docx";
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.AddHeader("content-disposition", "attachment; filename=\"" + docx + ".docx\"");
response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
stream.Position = 0;
stream.CopyTo(response.OutputStream);
response.End();
}
}
Ici, c'est le non-travail code :
public void OpenFile(HttpResponse response)
{
MemoryStream stream = this.FillTemplateOpenXmlWord();
string docx = "docx";
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.AddHeader("content-disposition", "attachment; filename=\"" + docx + ".docx\"");
response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
stream.Position = 0;
stream.CopyTo(response.OutputStream);
response.End();
}
public MemoryStream FillTemplateOpenXmlWord()
{
string filePath = @"c:\template.docx";
byte[] filebytes = File.ReadAllBytes(filePath);
using (MemoryStream stream = new MemoryStream(filebytes))
{
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(stream, true))
{
//do some changes
...
myDoc.MainDocumentPart.Document.Save();
}
return stream;
}
}
Une idée ?
merci
OriginalL'auteur DotNetBeliever | 2014-01-21
Vous devez vous connecter pour publier un commentaire.
ressemble flux est en cours de fermeture lorsque vous revenez. il est dans un bloc using. ne serait-ce pas fermer le flux de mémoire dès que le filltemplate procédure se termine?
OriginalL'auteur gashach
Voici ce que j'utilise pour générer des fichiers OpenXML de flux de mémoire. Dans ce cas, il rend XLSX fichier à partir d'un modèle sur le serveur, mais il devrait être similaire pour les autres formats OpenXml.
Action de contrôleur:
//De la classe Helper
OriginalL'auteur Tomino
La réponse posté par gashac ne décrit pas les problèmes que vous allez obtenir en appelant ne pas jeter sur un flux.
De ne pas disposer d'un flux de mémoire provoque des fuites de mémoire (même comme un "utilisation de la clause").
Mémoire des flux de maintenir les données dans la mémoire tandis que le flux de fichiers conserve les données sur le disque dur.
Solution:
Enregistrer le flux de mémoire dans un tableau d'octets, disposer les flux de mémoire et de retour de l'objet bytearray.
Comment retourner bytearray au lieu de flux
Voir le fil de discussion suivant le retour d'un fichier comme un objet bytearray:
HttpResponseMessage le Contenu ne sera pas afficher le PDF
OriginalL'auteur Dennis Hansen