繁体   English   中英

将mp3上载到NodeJS Express服务器会损坏文件

[英]Uploading mp3 to NodeJS Express server corrupts file

我想将MP3文件从Web客户端上传到Node Express服务器。 我可以上传文件,然后将其写入磁盘。 但是,文件已损坏,我无法使用MP3播放器播放歌曲。

如果有所不同,则是从OS X计算机上载文件,然后将其写入Ubuntu服务器。 上传的文件的大小大于原始文件的大小。 在此工作流程中我没有收到任何错误。 在开始播放文件之前,没有任何问题。

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

客户

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编码的字符串。

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

...结果属性包含作为URL的数据,该URL表示文件的数据为base64编码的字符串

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

使用此代码上传文件。 这是服务器端代码。 我将其命名为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");
});

创建一个views文件夹并将此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运行服务器node server.js 打开浏览器并运行此api http://localhost:3000/api/file然后选择它可能会audio/video/pdf/image etc ..任何要上传到磁盘的文件。 在这段代码中,我将文件public/uploads到此根项目文件夹中的public/uploads中。 您可以从要存储上载文件的位置提供目标文件夹。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM