读取文件会破坏二进制文件-Javascript

时间:2018-08-22 12:23:02

标签: javascript filereader binaryfiles corruption fbx

我有一个从Blender生成的FBX文件,我正在尝试使用zip压缩该文件以供在使用三个JS在AR环境中渲染图像的应用程序中使用以在Webapp中使用。现在,我正尝试使用javascript上传它,但是结果数据总是被几个字节破坏,使其完全无用。我在MacOS 10.13.6上使用HexFiend检查文件。

该文件是Blender中的1x1x1多维数据集,已使用7.3 FBX Binary协议导出。然后将其从Vue.js客户端加载到Laravel / Php 7.0.31后端。暂时不要介意缩进-这是我最近的尝试。

var decoder = new TextDecoder('utf-8');
var reader = new FileReader();
        reader.onload = (e) => {
            let asset = {};

            var result = new Uint8Array(e.target.result);
            var array = decoder.decode(result);

            asset.data = array;
            asset.filename = file.name;
            asset.size = file.size;
            asset.mime = file.type != '' ? file.type : "application/octet-stream";

            console.log(asset.data);

            //save it to an object that is then posted to the php side.
        }
reader.readAsArrayBuffer(file);

文件已生成,但始终会丢失一些,导致它们损坏并变得完全无用。我需要保持文件的二进制文件尽可能纯净。我怀疑utf-8编码会通过转换几个字符来破坏它。

到目前为止,我已经尝试了以下方法:

  1. readAsBinaryString:这会产生相同的工件,并在处理后使文件无用。
  2. readAsText:毫不奇怪,它的结果与上面相同。
  3. readAsDataURL:这会为base64实例创建一个未知的mime类型,该类型无法在前端使用,所以这是不可能的。
  4. readAsArrayBuffer直接注入到对象中:不幸的是,这只是一个巨大的无序数字数组
  5. 注入','或'。在可用之前先在阵列缓冲区之间进行“解密”。将大小扩大了2.5倍,但没有用!所以不是一个好的解决方案。
  6. 将阵列广播到16位-再次使用前需要进行“解密”。所以毫无疑问。
  7. 使用String.fromCharCode.apply(null,array)制作数组。结果与上述情况类似。

到目前为止,我所看到的唯一重要变化是在readAsBinaryString和上述解决方案之间。但是两者都不正确。

0 个答案:

没有答案