我有两个Office.js应用程序:
我可以在下载MSWord文档的纯JavaScript应用程序中成功调用一个端点。该文件是完整,完整且未损坏的。
但是,React应用程序中几乎相同的代码,调用相同的端点,下载相同的MSWord文档将返回稍长的数据长度(42523与40554,数据开始相同,然后更改如下:
文档数据的工作片段80,75,3,4,20,0,6,0,8,0,0,0,33,0,70,117,100,65533,1,0,0,32,8,0,0,19,0, 8,2,91,67,111,110,116,101,110,116,95,84,121,...
文档数据片段损坏80,75,3,4,20,0,6,0,8,0,0,0,33,0,70,117,100,63462,63411,1,0,0,32,8,0,0,19, 0,8,2,91,67,111,110,116,101,110,116,95,...
在我的(运行中)纯JavaScript应用程序中,代码如下所示:
downloadPath = "https://myserver.com/seal-ws/v5/downloads/6bb4dfd7e0a528dc68f2069f9d5da5a732692f49";
var xhr = new XMLHttpRequest;
xhr.open("GET", downloadPath);
xhr.addEventListener("load", function () {
var ret = [];
var len = this.responseText.length;
let trace = '';
for (let i = 0; i < len; i += 1) {
trace += this.responseText.charCodeAt(i) + ",";
}
console.log(trace);
console.log(len);
}, false);
xhr.setRequestHeader("X-Session-Token", XSessionToken);
xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
xhr.send(null);
在React应用程序中,返回损坏文件的代码如下:
const downloadPath = "https://myserver.com/seal-ws/v5/downloads/6bb4dfd7e0a528dc68f2069f9d5da5a732692f49";
const xhr = new XMLHttpRequest;
xhr.open("GET", downloadPath);
xhr.addEventListener("load", function () {
const ret = [];
const len = this.responseText.length;
let trace = '';
for (let i = 0; i < len; i += 1) {
trace = `${trace}${this.responseText.charCodeAt(i)},`
}
console.log(trace);
console.log(len);
}, false);
xhr.setRequestHeader("X-Session-Token", XSessionToken);
xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
xhr.send(null);
我已经使用fiddlr来检查两个应用程序的传出请求,并且两者看起来结构良好且彼此相同。我不明白为什么在React应用程序中响应看起来像相同的代码一样被破坏了?
这与浏览器没有什么区别,因为我已经在两个应用程序上使用IE进行了测试。我唯一能想到的是,原型为XMLHttpRequest对象使用了不同版本的javascript文件。
纯Javascript应用程序:
C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ JavaScript \ References \ domWeb.js
反应应用程序:
C:\ Users \\ AppData \ Local \ Programs \ Microsoft VS Code \ resources \ app \ extensions \ node_modules \ typescript \ lib \ lib.lib.dom.d.ts
有什么想法吗?
以上是我试图实现的目的的简化版本,以说明两种方法之间的数据略有损坏。最终,我正在尝试下载MSWord文档,然后执行一个打开的新实例命令,如以下代码所述。如上所述,以下代码在原型纯javascript应用程序中运行,但是在React应用程序中有此轻微损坏。生成的文档可以通过纯JavaScript正确打开,并且无法从React应用程序中打开损坏的版本。我确定与React作为框架无关,但我努力了解可能存在哪些差异,从而导致生成的数据以这种方式被误解码:
const downloadPath = "https://myserver.com/seal-ws/v5/downloads/6bb4dfd7e0a528dc68f2069f9d5da5a732692f49";
const xhr = new XMLHttpRequest;
xhr.open("GET", downloadPath);
/* eslint-disable no-bitwise */
xhr.addEventListener("load", function () {
const ret = [];
const len = this.responseText.length;
console.log('len');
console.log(len);
let trace = '';
for (let i = 0; i < len; i += 1) {
trace = `${trace}${this.responseText.charCodeAt(i)},`
}
console.log(trace);
let byte;
for (let i = 0; i < len; i += 1) {
byte = (this.responseText.charCodeAt(i) & 0xFF) >>> 0;
ret.push(String.fromCharCode(byte));
}
let data = ret.join('');
data = btoa(data);
console.log(data);
Word.run(context => {
const myNewDoc = context.application.createDocument(data);
context.load(myNewDoc);
return context.sync().then(() => {
context.sync();
myNewDoc.open();
});
});
}, false);
xhr.setRequestHeader("X-Session-Token", XSessionToken);
xhr.overrideMimeType("octet-stream; charset=x-user-defined;");
xhr.send(null);
由于产生不同输出的两个代码片段与React无关,请尝试复制粘贴使其在两个项目中具有相同的代码片段。
我想,问题是您这样做:
trace = `${trace}${this.responseText.charCodeAt(i)},`
重复trace
值,而不是每次迭代都累积新字符的代码。