10

編集後に返却したい docx ファイルがあります。私は次のコードを持っています...

object useFile = Server.MapPath("~/Documents/File.docx");
object saveFile = Server.MapPath("~/Documents/savedFile.docx");
MemoryStream newDoc = repo.ChangeFile(useFile, saveFile);
return File(newDoc.GetBuffer().ToArray(), "application/docx", Server.UrlEncode("NewFile.docx"));

ファイルは正常に見えますが、エラー メッセージが表示されます (「ファイルが破損しています」と「Word で読み取り不可能なコンテンツが見つかりました。ソースを信頼する場合は [はい] をクリックしてください」)。何か案は?

前もって感謝します

編集

これは私のモデルの ChangeFile です...

    public MemoryStream ChangeFile(object useFile, object saveFile)
    {
        byte[] byteArray = File.ReadAllBytes(useFile.ToString());
        using (MemoryStream ms = new MemoryStream())
        {
            ms.Write(byteArray, 0, (int)byteArray.Length);
            using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(ms, true))
            {                    
                string documentText;
                using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
                {
                    documentText = reader.ReadToEnd();
                }

                documentText = documentText.Replace("##date##", DateTime.Today.ToShortDateString());
                using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
                {
                    writer.Write(documentText);
                }
            }
            File.WriteAllBytes(saveFile.ToString(), ms.ToArray());
            return ms;
        }
    }
4

2 に答える 2

15

私はFileStreamResultを使用します:

var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = fileName,

        // always prompt the user for downloading, set to true if you want 
        // the browser to try to show the file inline
        Inline = false,
    };
Response.AppendHeader("Content-Disposition", cd.ToString());

return new FileStreamResult(documentStream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
于 2013-01-31T16:33:55.970 に答える
10

MemoryStream.GetBuffer().ToArray()useを使用しないでくださいMemoryStream.ToArray()

理由はGetBuffer()、メモリストリーム内の実際のデータではなく、メモリストリームの作成に使用される配列に関連しています。下にある配列は、実際にはサイズが異なる可能性があります。

MSDNに非表示:

バッファには、使用されていない可能性のある割り当てられたバイトが含まれていることに注意してください。たとえば、文字列「test」がMemoryStreamオブジェクトに書き込まれる場合、GetBufferから返されるバッファの長さは4ではなく256で、252バイトは未使用です。バッファ内のデータのみを取得するには、ToArrayメソッドを使用します。ただし、ToArrayはデータのコピーをメモリに作成します。

于 2013-01-31T21:44:18.057 に答える