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 部分。这是 获取文件(使用切片) 片段。
我正在为 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 部分。这是 获取文件(使用切片) 片段。