使用Horseman和PhantomJS下载wav文件,丢失数据质量

我使用PhantomJS和HorsemanJS从远程服务器下载wav文件。 但是,当文件是base64编码,并写入一个新的文件,它会丢失质量,使其无法使用。 audio在那里,但它的扭曲导致我认为它是一个编码问题。 我正在使用节点v5在Ubuntu 14.04上运行

下面是我的脚本任何想法也许改善base64编码?

var Horseman = require('node-horseman'); var horseman = new Horseman({cookiesFile:'./cookiejar'}); var fs = require('fs'); horseman.on("urlChanged", function(url){ console.log(url); }); horseman.on('consoleMessage', function( msg ){ console.log(msg); }); horseman .userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36") .open('https://remoteserver.com/audo.aspx?guid=01439900-5361-4828-ad0e-945b56e9fe51') .waitForNextPage() .type('input[name="password"]', process.env.PASS) .type('input[name="username"]', process.env.UN) .click("button:contains('Login')") .waitForNextPage() .evaluate(function(){ var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function base64encode(str) { var out, i, len; var c1, c2, c3; len = str.length; i = 0; out = ""; while(i < len) { c1 = str.charCodeAt(i++) & 0xff; if(i == len) { out += base64EncodeChars.charAt(c1 >> 2); out += base64EncodeChars.charAt((c1 & 0x3) << 4); out += "=="; break; } c2 = str.charCodeAt(i++); if(i == len) { out += base64EncodeChars.charAt(c1 >> 2); out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); out += base64EncodeChars.charAt((c2 & 0xF) << 2); out += "="; break; } c3 = str.charCodeAt(i++); out += base64EncodeChars.charAt(c1 >> 2); out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)); out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)); out += base64EncodeChars.charAt(c3 & 0x3F); } return out; } var url = $("a:contains('Uncompressed file')").attr("href"); console.log(url); var out; $.ajax({ 'async' : false, 'url' : url, 'success' : function(data, status, xhr) { console.log(status); console.log(xhr.getResponseHeader('Content-Type')); out = base64encode(data); } }); return out; }) .then(function(out){ fs.writeFile('./mydownloadedfile.txt', out, 'base64', function(){ return horseman.close(); }); }); 

内容types返回为audio/wav

如果文件被手动下载并通过相同的播放器播放,它会正常播放,只有当它经历了这个过程。

为什么不检查环境,在NodeJS中使用Buffer或者在浏览器中使用btoa() / atob()来进行base64编码和解码:

 function base64Encode(plainData) { if(isNode) { return new Buffer(plainData).toString('base64'); }else { return window.btoa(plainData); } } function base64Decode(encodedData) { if(isNode) { return new Buffer(encodedData, 'base64').toString(); }else { return window.atob(encodedData); } } 

在你的脚本中:

 var out; $.ajax({ 'async' : false, 'url' : url, 'success' : function(data, status, xhr) { console.log(status); console.log(xhr.getResponseHeader('Content-Type')); out = base64Encode(data); } }); return out; })...