[英]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.