Загрузка бинарного файла из БД и обработка его как openxml - PullRequest
0 голосов
/ 23 мая 2011

У меня есть такой способ загрузить файл документа из БД, который хранится в двоичном виде, а затем заменить части customxml параметрами.

Каким-то образом, когда я конвертирую байт в MemoryStream, а затем обрабатываю, что он не работает, мои пользовательские части XML не заменяются. Но если я использую FileStream и читаю тот же файл с диска, он отлично заменится!

Что не так с MemoryStream? я не могу также привести MemoryStream к FileStream или создать экземпляр Stream или т. д. Любое предложение?

  private static Stream LoadContent(byte[] content, XmlDocument parameters)
    {
        //FileStream works perfectly
        //Stream fileStream = new FileStream(@"C:\temp\test.docx", FileMode.Open);

        Stream documentStream = new MemoryStream();
        documentStream.Write(content, 0, content.Length);

        //Processes word file, replace custom xml parts with parameters
        using (WordprocessingDocument document = WordprocessingDocument.Open(documentStream, true))
        {
            MainDocumentPart mainPart = document.MainDocumentPart;
            Stream partStream = mainPart.CustomXmlParts.First().GetStream();

            using (XmlWriter xmlWriter = XmlWriter.Create(partStream, new XmlWriterSettings { CloseOutput = false }))
            {
                parameters.WriteTo(xmlWriter);
                xmlWriter.Flush();
            }

            mainPart.Document.Save();
        }

        return documentStream;
    }

1 Ответ

0 голосов
/ 23 мая 2011

Возможно, вы захотите установить для свойства «Позиция» потока памяти значение 0 после записи данных в него и перед повторным чтением.

Вы также можете передать байтовый массив в конструкторпоток памяти вместо вызывающего писателя.

edit

В соответствии с MSDN я вижу, что метод Document.Save очистит поток, чтобы разрешить сохранение пропппера.(http://msdn.microsoft.com/en-us/library/cc840441.aspx).Однако MemoryStream ничего не будет делать при сбросе (http://msdn.microsoft.com/en-us/library/system.io.memorystream.flush.aspx).

Вы можете попытаться создать новый MemoryStream, а затем передать его в качестве параметра методу Document.Save.

...