【问题标题】:save mp3 as ajax post data with node js使用节点 js 将 mp3 保存为 ajax 发布数据
【发布时间】:2014-05-16 02:39:17
【问题描述】:

不知道我做错了什么......

我有一个节点 js 网络服务器,它应该从 ajax 帖子将 mp3 文件保存到磁盘。该帖子包含一个 mp3 文件,该文件由浏览器中的 recorder.js 创建的 wav 文件构成。

在我的 requestHandler 中,我有以下代码:

var
formidable = require('formidable'),
http = require('http'),
path = require('path'),
fs = require('fs');

function requestHandler(req, res) {

 var requestPath = path.basename(req.url) || 'index.html',
     ext = path.extname(requestPath),
     localFolder = __dirname + '/public/',
     uploadFolder = __dirname + '/uploads/';

if(requestPath === 'uploadmp3' && req.method === 'POST') {

    var form = new formidable.IncomingForm();

    form.parse(req, function(err, fields, files) {
        if(err) {
            console.error(err.message);
            return;
        }
        var mp3File = uploadFolder + fields.fname;
        var base64File = new Buffer(fields.data, 'binary').toString('base64');
        var decodedFile = new Buffer(base64File, 'base64').toString('binary');

        fs.writeFileSync(mp3File, decodedFile, 'base64', function(err){
            if(err) {
                return console.log(err);
            }
            console.log('written to disk: ' + mp3File);
        });

        res.writeHead(200, {'Content-Type:' : 'text/plain'});
        res.write(mp3File+ ' \n\n');
        res.end('\n');
    });

    return;
  }
}

结果是我将文件保存到磁盘,但虽然大小正确,但时间设置不正确,播放持续一秒钟。

我可以毫无问题地用 php 保存它... mp3 文件播放完美,但我真的需要它才能在节点 js 上工作。

【问题讨论】:

    标签: javascript jquery ajax node.js mp3


    【解决方案1】:

    您需要使用 Stream 将内容保存到磁盘。根据您的实施:

    var fs = require('fs');
    if(requestPath === 'uploadmp3' && req.method === 'POST') {
        var mp3File = uploadFolder+'audio_feedback_' + new Date().getTime() + '.mp3';
        var mp3_file = fs.createWriteStream(mp3File);
    
        mp3_file.on('open', function (fd) {
            req.on('data', function(data){
                console.log("loading... \n");
                mp3_file.write(data);
            }); 
    
            req.on('end', function(){
                console.log("finalizing...");
                mp3_file.end();
    
                res.writeHead(200, {'Content-Type:' : 'text/plain'});
                res.write(mp3File+ ' is written to disk');
                res.end('\n');
            });
        });
    
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我已经修复了它:

      if(requestPath === 'uploadmp3' && req.method === 'POST') {
          var mp3 = '';
          var mp3File = uploadFolder+'audio_feedback_' + new Date().getTime() + '.mp3';
          // req.setEcoding('base64');
      
          req.on('data', function(data){
              console.log("loading... \n");
              mp3 += data;
          });
          req.on('end', function(){
              console.log("request completed");
      
              fs.open(mp3File, 'w', function(err, fd) {
                  if(err) {
                      return console.log(err);
                  }
                  // console.log(mp3File + ' file was read...');
                  fs.writeFile(mp3File, mp3, 'base64', function(err){
                      if(err) {
                          return console.log(err);
                      }
                      console.log('written to disk: ' + mp3File);
                  });
              });
      
              res.writeHead(200, {'Content-Type:' : 'text/plain'});
              res.write(mp3File+ ' is written to disk');
              res.end('\n');
          });
      
      }
      

      【讨论】:

      • 为了确保您的文件是一致的并避免它的结构损坏,您应该使用流。
      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多