2012-08-21 2 views
2

Итак, у меня есть сценарий Node.js и файл Javascript, сообщающийся друг с другом, и все работает, за исключением того, что Node.js должен возвращать данные для файла .mp3.Возьмите двоичные данные и сохраните их как .mp3-файл Javascript

Данные двоичные, это похоже на тарабарщину, как я могу взять эти данные, которые он возвращает, и разрешить пользователю загружать его на веб-странице с помощью Javascript?

Он получает данные, используя http.responseText.

Node.js Код

//initilization 
var querystring = require('querystring'); 
var http = require('http'); 
var url = require('url'); 
var fileSystem = require('fs'); 
var path = require('path'); 
var util = require('util'); 

//convert function 
function convert(voiceToUse, textToConvert, response) 
{ 
    console.log("Sending Convert Request..."); 

    //data to send as a query 
    var data = querystring.stringify(
    { 
     username: 'user', 
     password: 'pass', 
     action: 'convert', 
     voice: voiceToUse, 
     text: textToConvert 
    }); 

    //options to use 
    var options = { 
     host: 'ws.ispeech.org', 
     port: 80, 
     path: '/api/rest/1.5', 
     method: 'POST', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded', 
      'Content-Length': data.length 
     } 
    }; 

    //http post request 
    var req = http.request(options, function (res) 
    { 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) 
     { 
      console.log("Body: " + chunk); 
      var fileId = chunk.substr(chunk.indexOf("fileid") + 7); 
      console.log("Converting File..."); 
      download(fileId.substr(0, fileId.search("&")), response); 

     }); 
    }); 


    req.on('error', function (e) 
    { 
     console.log('problem with request: ' + e.message); 
    }); 

    req.write(data); 
    req.end(); 
} 

//download function 
function download(id, response) 
{ 

    //data to send as a query 
    var data = querystring.stringify(
    { 
     username: 'user', 
     password: 'pass', 
     action: 'download', 
     fileid: id 
    }); 

    //options to use 
    var options = { 
     host: 'ws.ispeech.org', 
     port: 80, 
     path: '/api/rest/1.5', 
     method: 'POST', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded', 
      'Content-Length': data.length 
     } 
    }; 

    //http post request 
    var req = http.request(options, function (res) 
    { 
     res.on('data', function (chunk) 
     { 
      if (JSON.stringify(res.headers).indexOf("audio/mp3") != -1) 
      { 
       console.log("Downloading Chunk..."); 
       /*var fs = require('fs'), 
        str = 'string to append to file'; 
       fs.open('test.mp3', 'a', 666, function (e, id) 
       { 
        fs.write(id, chunk, 0, chunk.length, 0, function() 
        { 
         fs.close(id, function() 
         { 
         }); 
        }); 
       });*/ 
       response.write(chunk, "binary"); 
      } 
      else 
      { 
       download(id, response); 
      } 

     }); 

     res.on('end', function() 
     { 
      if (JSON.stringify(res.headers).indexOf("audio/mp3") != -1){ 
      response.end(); 
      } 
     }); 
    }); 


    req.on('error', function (e) 
    { 
     console.log('problem with request: ' + e.message); 
    }); 

    req.write(data); 
    req.end(); 
} 
http = require('http'); 
fs = require('fs'); 
server = http.createServer(function(req, res) { 

    console.dir(req.param); 

    if (req.method == 'POST') { 
     console.log("POST"); 
     var body = ''; 
     req.on('data', function (data) { 
      body += data; 
      console.log("Partial body: " + body); 
     }); 
     req.on('end', function() { 
      console.log("Body: " + body); 
      if(body){ 
       convert('engfemale1', body, res); 
       res.writeHead(200, { 
        'Content-Type': 'audio/mp3', 
        'Content-Disposition': 'attachment; filename="tts.mp3"' 
       }); 
      } 
     }); 

    } 
}); 

port = 8080; 
server.listen(port); 
console.log('Listening at port ' + port); 

код Javascript

console.log('begin'); 
     var http = new XMLHttpRequest(); 
     var params = "text=" + bodyText; 
     http.open("POST", "http://supersecretserver:8080", true); 

     http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     //http.setRequestHeader("Content-length", params.length); 
     //http.setRequestHeader("Connection", "close"); 

     http.onreadystatechange = function() { 
      console.log('onreadystatechange'); 
      if (http.readyState == 4 && http.status == 200) { 
       alert(http.responseText);//response text is binary mp3 data 
      } 
      else { 
       console.log('readyState=' + http.readyState + ', status: ' + http.status); 
      } 
     } 

     console.log('sending...') 
     http.send(params); 
     console.log('end'); 
+0

Почему вы используете XMLHttpRequest, если вы предоставляете файл для загрузки? – Quentin

+0

Я делаю запрос на сервер node.js, который преобразует текст в речь. Файл javascript извлекает текст со страницы и отправляет его в POST, и он получает двоичные mp3-данные с сервера node.js в качестве ответа. –

+0

Возможно, код может помочь. –

ответ

1

Вы можете попробовать использовать URL-адреса данных:

<a href="data:audio/mpeg3;charset=utf-8;base64,Zm9vIGJhcg==">mp3 download</a> 

Не лучшая поддержка браузера, хотя.

Также можно использовать URL-адреса данных непосредственно в звуковых тегах.


Лучшим решением было бы сохранить mp3 на вашем сервере и вернуть ссылку на него для использования mp3-плеера.

+0

Я не могу выделить какое-либо место на сервере для чего-либо, кроме сценария. Это будет использоваться несколькими тысячами человек, по крайней мере, каждый день, так что потребуется дополнительное время, чтобы сценарий для сервера сортировал все mp3-файлы. Я попробую использовать URL-адрес данных, но я не уверен, что браузер предназначен для поддержки этого. –

Смежные вопросы