Search code examples
javascriptnode.jsxmlhttprequest

Download mp3 file from url with xmlHttpRequest and writing it to file


I've currently tried every possible ways to do this but I cannot get it to work, despite reading every related question on the internet ...

I'm simply trying to download an mp3 arrayBuffer that i GET from an url with the module xmlHttpRequest from my node server code with the intent to then writing the buffer to an mp3 file, here is the code:

const endpoint = "https://cdns-preview-a.dzcdn.net/stream/c-ae4124ee0e63b9f6abffddb36b9695cf-2.mp3";
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var oReq = new XMLHttpRequest();
oReq.open("GET", endpoint, true);
oReq.responseType = "arraybuffer";

oReq.onload = function (oEvent) {
    if (this.status != 200) {
        console.log(this.status)
    }
    console.log(oReq.response);
    var uInt8Array = new Uint8Array(oReq.response);
    console.log(uInt8Array);

    var dest = "1.mp3";
    var stream = fs.createWriteStream(dest);

    stream.write(uInt8Array);
    stream.end();
  }
};

oReq.send();

oReq.response is always empty, no matter what I type in oReq.responseType(arraybuffer, blob). if I try to write oReq.responseText, it's always going to be some scuffed encoding because it was translated to text.

Can you give me advices, is there some underlying deep layer that I don't understand, is it possible to do what I wanna achieve?


Solution

  • Found a solution with http get instead of xmlHttpRequest:

    const endpointe = "https://cdns-preview-a.dzcdn.net/stream/c-ae4124ee0e63b9f6abffddb36b9695cf-2.mp3";
    https.get(endpointe, (res) => {
        datatest = []
    
        res.on('data', function(chunk) {
            datatest.push(chunk);
            console.log(chunk);
        });
    
        // The whole response has been received. Print out the result.
        res.on('end', () => {
            //console.log(data)
            var dest = "test.mp3";
            var stream = fs.createWriteStream(dest);
            var buffer = Buffer.concat(datatest);
            stream.write(buffer);
            stream.end();
        });
    
        }).on('error', (e) => {
        console.error(e);
    });