上传mp3到NodeJS Express服务器损坏文件

我想从我的Web客户端上传一个MP3文件到Node Express服务器。 我可以上传文件,然后写入磁盘。 但是,文件被损坏,我不能用MP3播放器播放歌曲。

如果有所作为,文件将从OS X机器上传,然后写入Ubuntu服务器。 上传的file upload的大小比原来的大。 我在这个工作stream程中没有收到错误。 直到我开始播放文件,没有任何问题。

请参阅下面的代码。 任何想法,为什么我遇到这个?

客户

uploadSong: (song) => { fetch('http://localhost:8080/song', { method: 'PUT', headers: { 'Content-Type': 'audio/mpeg', }, body: song }) .then( response => { console.log("Got response after uploading song:", response); }) .catch( error => { console.log("Error in Firebase AC upload song: ", error); }); } 

服务器

 app.put("/song", (req, res) => { var mp3SongName = 'test.mp3'; var mp3_file = fs.createWriteStream(mp3SongName); 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.sendStatus(200); }); }); } 

我注意到,当检查上传的文件,数据被写入一个base64编码的string。

我追溯到我的客户端代码,这是使用FileReader.readAsDataUrl方法读取文件:

…结果属性包含数据作为表示文件数据的URL,作为base64编码的string

谜团已揭开。 现在我只需要确定是解码服务器上的文件,还是使用不首先编码的FileReader方法。

使用此代码进行file upload。 这是服务器端代码。 我把它命名为server.js

 var express = require('express'); var multer = require('multer'); var path = require('path'); var rand; var app = express(); var ejs = require('ejs') app.set('view engine', 'ejs') var storage = multer.diskStorage({ destination: function(req, file, callback) { callback(null, './public/uploads') }, filename: function(req, file, callback) { //callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)) //callback(null, file.originalname) rand=Date.now() + path.extname(file.originalname); callback(null, file.fieldname + '-' + rand); } }) var upload = multer({ storage: storage}); app.get('/api/file',function(req,res){ res.sendfile('E:/syed ayesha/nodejs/uploads/video/views/video.html'); }); app.post('/api/file',upload.single('userFile'), function(req, res) { console.log(req.file); console.log(req.file.path); res.send(rand); }) app.listen(3000,function(){ console.log("working on port 3000"); }); 

创build一个视图文件夹,并将其放置在这个HTML文件。 我命名为video.html

 <form id="uploadForm" enctype="multipart/form-data" action="/api/file" method="post" > <input type="file" name="userFile"/> <input type="submit" value="Upload File" name="submit"> </form> 

运行服务器一个node server.js 。 打开浏览器并运行这个api http://localhost:3000/api/file并select任何文件,可能是audio/video/pdf/image etc ..任何你想上传到磁盘的文件。 在这个代码中,我正在上传我的文件到public/uploads在这个根项目文件夹。 您可以从您想要存储上传文件的位置提供目标文件夹。 希望这可以帮助。