Невозможно вернуть документ Word, созданный в потоке памяти, для загрузки пользователю - PullRequest
0 голосов
/ 21 января 2020

У меня проблема при решении одной задачи. Задача состояла в том, чтобы: Создать возможность пользователям загружать документ .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 не возвращает никаких ошибок - страница refre sh и загрузка не начинается. Обработчик звонит с 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, откуда обработчик вызывает из кнопка ссылки. Но это должно работать в проекте веб-форм.


Обновление для отображения вопросов и неправильных ответов: файл создан и правильно сохранен на локальном компьютере.

1 Ответ

0 голосов
/ 21 января 2020

Я вижу несколько проблем в вашем коде. Во-первых, new MemoryStream(FileBytes) создает неизменяемый размер MemoryStream, а это не то, что вам нужно, если вы меняете WordprocessingDocument. Вам следует использовать new MemoryStream() для создания изменяемого размера MemoryStream и скопировать ваш FileBytes в этот MemoryStream.

Во-вторых, поскольку вы находитесь в операторе using, вам не нужно следующие две строки кода. Это делается автоматически для вас.

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

Наконец, я не уверен относительно вашего значения ContentEncoding для двоичных данных, которые вы отправляете. Возможно, вы захотите использовать такой инструмент, как Fiddler или Postman, чтобы проверить, что происходит.

...