我從OpenXML的MemoryStream出現問題。我成功地打開了一個Word文件,通過HttpResponse進行更改並下載它,如果我使用單一方法完成所有步驟的話。C#從OpenXML返回內存流導致損壞的Word文件
但是,如果我試圖通過返回MemoryStream在兩個不同的類(或方法)中做到這一點,我得到一個損壞的word文件。我想過沖洗或緩衝區問題,但我找不到解決方案。
這裏是工作代碼:
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();
}
}
這裏的非工作代碼:
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;
}
}
任何想法?
謝謝
我剛剛發現了同樣的事情。當我得到答案時,我非常接近編輯我的問題並給出解決方案。 你說得對!我在使用條款中返回一個流。退貨不會創建副本,而是創建參考。所以,在調用方法中,我得到了一個不在using子句中的流的引用。該流被丟棄,內容不再可用。 謝謝 – DotNetBeliever