无法返回在内存流中生成的 Word 文档以下载给用户



我在解决一项任务时遇到了问题。任务是:为用户创建一个下载包含粘贴数据的.docx文档的机会。但是我现在无法将文件作为字节数组(取自MemoryStream(发送到上下文的响应。下面是一个示例:

using (MemoryStream stream = new MemoryStream(FileBytes))
{
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(stream, true))
{
MainDocumentPart mainPart = myDoc.MainDocumentPart;
foreach (SdtElement obj in mainPart.Document.Body.Descendants<SdtElement>().ToList())
{
foreach (Text t in obj.Descendants<Text>().ToList())
{
switch (t.Text)
{
//.... here is code that fiiling content control's
}
}
}
myDoc.MainDocumentPart.Document.Save();
myDoc.Close();
}
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.AddHeader("content-disposition", "attachment; filename="" + DocName + ".docx"");
context.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
context.Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1");
stream.Seek(0, SeekOrigin.Begin);
context.Response.BinaryWrite(stream.ToArray());
}
context.Response.Flush();

HTTP 处理程序不会返回任何错误 - 页面刷新和下载不会启动。处理程序正在从 JS 调用。下面是 JS 函数的示例:

function save_word_doc(id_btn) {
// ... here is code that gets params from default page data
jQuery.post("DataHandler.ashx?CN=" + vCN + "&CommandName=SaveWord&auctionID=" + oFormRecord.auctionID
+ "&user_login=" + user_login
+ ....
+ "&amount=" + oFormRecord.value.amount
+ "&percent=" + percent);
}

顺便说一下,此示例代码在 ASP.Net MVC 项目中运行良好,其中处理程序从链接按钮调用。但这必须在 Web 窗体项目中工作。


更新以假装问题和错误答案:文件已生成并正确保存到本地计算机。

我在你的代码中看到了一些问题。首先,new MemoryStream(FileBytes)创建一个 不可调整大小的MemoryStream,如果您要更改WordprocessingDocument,这不是您想要的。您应该使用new MemoryStream()创建一个可调整大小的MemoryStream并将您的FileBytes复制到该MemoryStream

其次,由于您处于using语句中,因此不需要以下两行代码。这是自动为您完成的。

myDoc.MainDocumentPart.Document.Save();
myDoc.Close();

最后,我不确定您发送的二进制数据的ContentEncoding值。您可能希望使用Fiddler或Postman之类的工具来验证会发生什么。

最新更新