enregistrer le document créé par docX en réponse et l'envoyer à l'utilisateur pour le téléchargement
Je suis en train d'utiliser l'incroyable DocX bibliothèque sur codeplex pour créer un document word.
lorsque l'utilisateur clique sur un bouton, le document est créé et je veux être en mesure de l'envoyer immédiatement à l'utilisateur via de réponse.. je suis en train de faire quelque chose de similaire à ceci maintenant:
Modifié le code en se basant sur les suggestions
using (DocX Report = DocX.Create(string.Format("Report-{0}.doc", DateTime.Now.Ticks)))
{
Paragraph p = Report.InsertParagraph();
p.Append("Title").FontSize(30).Bold()
.Append("Sub title").FontSize(28)
.AppendLine()
.Append(DateTime.Now.Date)
;
MemoryStream ms = new MemoryStream();
Report.SaveAs(ms);
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".docx\"");
Response.ContentType = "application/msword";
Response.Write(ms);
Response.End();
}
J'ai essayé quelques variantes de ce.. mais je ne suis pas en mesure de réaliser ce que je veux.. En regardant cette réponse je peux éventuellement enregistrer le document sur le serveur et ouvrez-le avec io ruisseau.. mais je veux éviter cette étape supplémentaire (et puis j'ai besoin de supprimer le fichier trop)
Je ne vois pas l'intérêt de la création d'un fichier de quelques milli secondes.. il y a un moyen de sauvegarder le contenu et les envoyer à des flux de réponse..?
Comment avais-je faire?
merci..
EDIT: mon code actuel soit vomit impossible d'ouvrir le fichier (Accès refusé) erreur Si je suis en utilisant le fichier de flux, OU télécharge un document vide de fichier sans contenu (parfois, le type de réponse est écrite dans le document)
Ce code m'obtient un document MS word avec System.IO.MemoryStream
comme c'est le contenu..
Ok, c'est la dernière solution de travail:
Pour une raison quelconque, DocX bibliothèque ne souhaitez pas enregistrer de Response.OutputStream
directement, donc j'ai dû l'enregistrer dans la mémoire de flux et écrire le flux de mémoire de réponse, comme Neil & Daniel suggéré. Voici ce qui a fonctionné pour moi:
MemoryStream ms = new MemoryStream()
Report.SaveAs(ms);
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".doc\");
Response.ContentType = "application/msword";
ms.WriteTo(Response.OutputStream);
Response.End();
modifié le code pour vous répondre, merci!
Je suis confus qui répondent à accepter, j'ai pu voter deux fois comme m'a aidé...
Grâce LocustHorde pour votre question et votre dernière solution de travail. Il ne m'aident beaucoup.
OriginalL'auteur LocustHorde | 2012-01-24
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser un
MemoryStream
au lieu d'unFileStream
.Votre code ressemble vraiment mal:
Vous enregistrez le rapport à la
OutputStream
de la réponse en courant et puis clair que la réponse (!)Salut, est-flux de Mémoire sûr? il ne consomme trop de ram si je l'utilise pour les gros fichiers? (les fichiers d'environ 1 MO) ? merci
MemoryStream est pratiquement tout simplement un byte[] tableau. Donc, il n'y a pas de gros frais généraux de l'utiliser. Vous pouvez l'utiliser sans problèmes, même pour les gros fichiers. BTW: 1 MO n'est pas grand.
Salut, faire de mme.WriteTo(La Réponse.OutputStream) ont travaillé.. merci pour le pousser dans la bonne direction!
bien, 1 MO n'est pas grand sur son propre, mais quand il est utilisé par les 30K utilisateurs par jour, il pourrait obtenir un peu de la main!
OriginalL'auteur Daniel Hilgarth
Cela peut-être un peu tard, mais j'ai trouvé un moyen de le faire fonctionner avec FileStreamResult:
L'important est le réglage de la Position de la memorystream à 0, sinon il est apparu à la fin, et le fichier a été de retour à vide.
OriginalL'auteur Chris W
Lorsque vous ne
Report.SaveAs(response.OutputStream);
- il déjà écrit contenu du fichier dans le flux de sortie. Vous n'avez pas besoin de faireResponse.Write(response.OutputStream);
De sorte que vous code devrait ressembler à ceci:
OriginalL'auteur Pavel Morshenyuk
Je pense que vous avez des choses un peu l'arrière vers l'avant et confus.
Tout d'abord, désactivez la sortie, puis ajouter les en-têtes, puis d'écrire le contenu.
Aussi , si votre fichier est un fichier de format docx, append .docx plutôt que .doc de votre nom de fichier.
Je ne pense pas que vous MemoryStream. L'exemple ci-dessus est le Rapport de l'instance d'écrire un document directement vers le flux de sortie.
mais en fait ça ne marchait pas.. c'est pourquoi j'ai eu recours à MemoryStream... - à l'aide de Rapport.SaveAs(la réponse.OutputStream) me donne une erreur de méthode qui n'est pas pris en charge
Aucun des exemples de code dans vos éditions de l'utilisation de cet échantillon. La première tentative a écrit pour le flux de sortie, puis effacé la réponse, puis il écrit les en-têtes. La dernière édition a vous écrire pour un flux de mémoire, mais alors vous ne copiez pas le contenu de ce flux de la réponse du flux de sortie. Avez-vous essayé cette réelle de l'échantillon?
Ok bonne nouvelle. N'oubliez pas de mettre un
using
clause autour de votre flux de mémoire!OriginalL'auteur Neil Moss