簡體   English   中英

使用節點js將mp3保存為ajax發布數據

[英]save mp3 as ajax post data with node js

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

我有一個節點js webserver,應該從ajax帖子將mp3文件保存到磁盤。 該帖子包含一個mp3文件,該文件是由browser.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。

您需要使用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');
        });
    });

}

希望這可以幫助。

我已修復它:

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');
    });

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM