我正在尝试将以下代码从php转换为javascript:
echo base64_encode(gzencode( file_get_contents("image.png") ));
我上面代码的javascript版本如下:
var zlib = require('zlib');
var xhr = new XMLHttpRequest();
xhr.open( "GET", "http://localhost:3000/image.png", true );
xhr.responseType = "arraybuffer";
xhr.onload = function( e ) {
var arrayBufferView = new Uint8Array( this.response );
var blob = new Blob( [ arrayBufferView ], { type: "image/png" } );
var reader = new FileReader();
reader.onloadend = function () {
var blobStr = reader.result;
zlib.gzip(blobStr, function(err, buf) {
var b64 = new Buffer(buf).toString('base64');
console.log(b64);
});
}
reader.readAsBinaryString(blob);
};
xhr.send();
我请求文件并将其转换为png类型的Blob。然后,我使用FileReader将文件读取为二进制字符串。然后,我将该二进制字符串gzip压缩,然后进行base64编码。我的最终输出以b64变量结尾。
但是,此输出最终不同于php输出。
在chrome控制台中播放,让我觉得二进制字符串可能是格式问题,因为我无法从控制台复制完整的字符串。
我还觉得两个gzip可能有所不同,因为echo base64_encode(gzencode( "test" ));
返回
H4sIAAAAAAAACytJLS4BAAx + f9gEAAAA
同时
var zlib = require('zlib');
zlib.gzip("test", function(err, buf) {
var b64 = new Buffer(buf).toString('base64');
console.log(b64);
});
返回
H4sIAAAAAAAAAytJLS4BAAx + f9gEAAAA
请注意,除了第13个字符用“ C”代替“ A”外,字符串几乎相同。不确定是否足以将实际图像文件数据搞砸了。
任何想法如何使javascript版本具有与php版本相同的输出?事情变坏了哪一步?我真的需要它们具有相同的输出,因为第三方库会读取php版本创建的字符串。