Office/Word 加载项上传文件到 MVC 应用程序

Office/Word Add-in Uploading File to MVC Application

我正在为 Word 构建一个加载项,目标是能够将打开的 Word 文档保存到我们的 MVC Web 应用程序中。我已经关注 this guide 并发送这样的切片:

function sendSlice(slice, state) {
    var data = slice.data;

    if (data) {
        var fileData = myEncodeBase64(data);       
        var request = new XMLHttpRequest();

        request.onreadystatechange = function () {
            if (request.readyState == 4) {

                updateStatus("Sent " + slice.size + " bytes.");
                state.counter++;

                if (state.counter < state.sliceCount) {
                    getSlice(state);
                }
                else {
                    closeFile(state);
                }
            }
        }
        request.open("POST", "http://localhost:44379/api/officeupload/1");
        request.setRequestHeader("Slice-Number", slice.index);
        request.setRequestHeader("Total-Slices", state.sliceCount);
        request.setRequestHeader("FileId", "abc29572-8eca-473d-80de-8b87d64e06a0");
        request.setRequestHeader("FileName", "file.docx");

        request.send(fileData);
    }
}

然后像这样接收切片:

    public void Post()
    {
        if (Files == null) Files = new Dictionary<Guid, Dictionary<int, byte[]>>();

        var slice = int.Parse(Request.Headers.GetValues("Slice-Number").First());
        var numSlices = int.Parse(Request.Headers.GetValues("Total-Slices").First());
        var filename = Request.Headers.GetValues("FileName").First();
        var fileId = Guid.Parse(Request.Headers.GetValues("FileId").First());

        var content = Request.Content.ReadAsStringAsync().Result;

        if (!Files.ContainsKey(fileId)) Files[fileId] = new Dictionary<int, byte[]>();
        Files[fileId][slice] = Convert.FromBase64String(content);

        if (Files[fileId].Keys.Count == numSlices)
        {
            byte[] array = Combine(Files[fileId].OrderBy(x => x.Key).Select(x => x.Value).ToArray());

            System.IO.FileStream writeFileStream = new System.IO.FileStream("c:\temp\test.docx", System.IO.FileMode.Create, System.IO.FileAccess.Write);
            writeFileStream.Write(array, 0, array.Length);
            writeFileStream.Close();

            Files.Remove(fileId);
        }
    }

问题是控制器生成的文件在 Word 中不可读。我已经用 "Test123" 作为文档的全部内容的 word 文档进行了测试,当文件通过 word 保存时它是 13kb,但是当发送到网络应用程序并从那里保存时文件是 41kb。

我的假设是我在编码或解码中遗漏了一些东西,因为我只发送一个切片,所以重新组合它们应该没有问题。

Script Lab 中有一个 Excel 代码段可生成 base64 编码文件,您可以将其粘贴到 www.base64decode.org 等在线解码器中。 API 与 Word 中的相同。这可以帮助您隔离编码代码。安装 Script Lab 后,打开 Samples 选项卡,滚动到 Document 部分。这是 获取文件(使用切片) 片段。