使用Javascript XMLHttpRequest时,从服务器传输的二进制数据丢失了字节。

3

我已经折腾了几天了,但还是没有结果 :( 如果能有帮助就太感激了。

我正在尝试使用下面这种方法将文件下载为类型化数组:

var oReq = new XMLHttpRequest();
oReq.open("GET", "/myfile.png", true); //This is the path to my file 
oReq.responseType = "arraybuffer";

oReq.onload = function (oEvent) {
 var arrayBuffer = oReq.response; 
 var array = new Uint8Array(arrayBuffer ); //This is the array I retrieve from my file
};

oReq.send(null);

当我将所有资源放在我的电脑硬盘上时,它可以完美地工作,并且我会收到一个看起来像这样的响应数据(这只是示例数据):

array[0] = 10;
array[1] = 15;
array[2] = 20;
array[3] = 17;
array[4] = 18;
array[5] = 23;
array[6] = 25;
array[7] = 12;
array[8] = 2;
array[9] = 10;
...

然而,当我将所有东西上传到服务器时,结果看起来像这样:
array[0] = 10;
array[1] = 15;
array[2] = 20;
array[3] = 17;
array[4] = 18;
array[5] = 25;  //This number is missing from above, it should be 23
array[6] = 12;
array[7] = 2;
array[8] = 10;
array[9] = 18;
...

我已经尝试了所有我能想到的方法来解决这个问题。清除缓存、打开和关闭 gzip,使用不同设备进行测试(例如在手机和电脑上加载),但是迄今为止没有任何帮助。

让我感到奇怪的是,同样的数字每次都是错误的。因此,我认为它们并没有在网络中“丢失”。而且当我用另一个服务器进行测试时,我得到了不同的数字下降。所以似乎每个服务器都会丢失一组不同的数字。

有人知道这是为什么吗,并且能否指导我朝着解决问题的方向前进?非常感谢!


每个浏览器的表现都是一样的,我主要使用Chrome和Firefox,但它们都显示相同的数字。 - YAHsaves
SyntaxError: 非法字符...然后(res => res.arrayBuffer())。then(ab => new Uint8Array(ab))。then(u => console.log - YAHsaves
不知道你的服务器在做什么,但它肯定在进行某些操作...当你说“保存”时,你是指重命名吗?在服务器文件系统中,不同扩展名的文件长度是否相同? - Jaromanda X
两个问题都回答是。 - YAHsaves
好的,非常感谢您的时间和帮助。我会继续搜索,如果找到解决方案,我会在我的问题下发布回复,以帮助其他陷入类似困境的人。我还有一个来自Godaddy的服务器,在不同的地方做着类似的事情,所以我想这可能是一个常见的问题,但看来并不是。好吧,似乎又要重新开始了 :-) - YAHsaves
显示剩余22条评论
1个回答

3

我弄明白了……这是一次有趣的经历。

原来我使用的FTP客户端(FileZilla)有一个设置,会自动尝试检测文件的数据类型,并进行必要的调整,以便在所有操作系统上正确显示。

这是一种记录下来的行为,可以在这里阅读到:https://wiki.filezilla-project.org/Data_Type

当我关闭了这个行为(在“传输”-“传输类型”选项卡下将其从自动切换到二进制)时,一切都按照预期工作了。

我非常感谢Jaromanda X愿意帮助我。他的答案给了我需要尝试这些设置的见解。我希望这将有助于未来遇到同样问题的其他人!


不合理的是它去掉了一个值为23的字节!如果缺少13,我可以理解,这可能意味着某种“行末”诡计……但是23? - Jaromanda X
我也不理解,但是在整个文件中它一直在删除随机值甚至移动它们。我不会声称理解它,我只知道我改变了ftp设置,现在一切都正常工作了。所以,希望这能帮助到某人 :D - YAHsaves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接