使用Office.jsAPI保存Word文档(.docx)到后端服务器

Save Word document (.docx) using Office.js API to back-end server

我在将 byte 数组(使用 Office.js 从 Microsoft Office 的任务窗格中获取)保存到 Word 文档文件(在服务器端)时遇到了一些问题。这就是我正在做的事情:

Java脚本

$('#push').click(function () {
  $.when(OffQuery.getContent({ sliceSize: 1000000 }, function (j, data, result, file, opt) {
    // ...nothing interesting here
  })).then(function (finalByteArray, file, opt) {
    // (1) this line is changed...see the answer
    var fileContent = Base64.encode(finalByteArray); //encode the byte array into base64 string.

    $.ajax({
      url: '/webcontext/api/v1/documents',
      // (2) missing setting (see the answer)
      data: fileContent,
      type: 'POST'
    }).then(function () {
      // updateStatus('Done sending contents into server...');
    });
  }).progress(function(j, chunkOfData, result, file, opt){
    // ...nothing interesting here
});

Java / Spring

@RequestMapping(method = RequestMethod.POST) // As OOXML
public void create(@RequestBody String fileContent, HttpServletRequest request) throws Exception { // TODO
  LOGGER.debug("{} {}", request.getMethod(), request.getRequestURI());
  //LOGGER.debug("fileContent: {}", fileContent);
  try {
    val base64 = Base64.decodeBase64(fileContent); // From Apache Commons Codecs

    FileUtils.writeByteArrayToFile(new File("assets/tests/output/some_file.docx"), base64);
  } catch (IOException e) {
    LOGGER.error("Crash! Something went wrong here while trying to save that...this is why: ", e);
  }
}

...但是文件正在按原样保存;基本上是将 byte 数组作为文本文档保存到文件中。

我错过了什么吗?你有什么线索吗?有人使用过 Office.js、任务面板和类似的东西吗?

提前致谢...

更新 1

原来 finalByteArray 正在转换为 Base64 字符串 (fileContent),但是当我尝试在 Java 中进行反向操作时,它不起作用...如果以前有人这样做过,请告诉我。我试过:

  1. Mozilla 页中的示例
  2. Unibabel
  3. base64-js

...在 Java 端(将 Base64 String 解码为 byte 数组):

  1. 默认Base64encoder/decoder
  2. Base64 Apache codec

您的代码中没有明显的错误,除了(如评论所述)我不知道您为什么要从代码中删除最后一个字符。

你为什么不使用像 Firebug 这样的 javascript 调试器和远程 Java 调试器来检查你的处理过程中的每一步并控制各种内容变量 (Javascript fileContent, Java fileContent, Java base64) 来找出错误发生的地方。

其实,我发现了错误。它在客户端。 Office.js SDK 中包含一个函数,可以将 byte 数组转换为 Base64 string——尽管我不确定如果所有版本都附带,我使用的是 Office.js SDK 1.1.

所以我将转换更改为:

var fileContent = OSF.OUtil.encodeBase64(finalByteArray);

...在 AJAX 调用中我添加了 contentType 设置:

  $.ajax({
    //...
    contentType: 'application/octet-stream',
    // ...
    type: 'POST'
  }).finish(function () {
    // ...
  });

通过正确设置内容类型,我能够 post "the right content" 到服务器。

Even if I do the correct Base64 conversion without setting the correct Content Type, the received data in the Spring controller is different (larger in this case) than the one reported in the client side.

我希望这对以后的其他人有所帮助。 Microsoft Web 中的示例非常清楚,但由于某些原因 "there is always something different between environments".