Javascript 将mp3上载到NodeJS Express服务器会损坏文件
我想将MP3文件从web客户端上载到Node Express服务器。我可以上传文件,然后将其写入磁盘。但是,文件被破坏了,我不能用MP3播放器播放这首歌 如果有区别的话,文件将从OSX机器上传,然后写入Ubuntu服务器。上载文件的上载大小大于原始文件的上载大小。我在此工作流中未收到任何错误。在我开始播放文件之前,没有任何问题 请参阅下面的代码。你知道我为什么会这样吗 客户Javascript 将mp3上载到NodeJS Express服务器会损坏文件,javascript,node.js,express,web,file-upload,Javascript,Node.js,Express,Web,File Upload,我想将MP3文件从web客户端上载到Node Express服务器。我可以上传文件,然后将其写入磁盘。但是,文件被破坏了,我不能用MP3播放器播放这首歌 如果有区别的话,文件将从OSX机器上传,然后写入Ubuntu服务器。上载文件的上载大小大于原始文件的上载大小。我在此工作流中未收到任何错误。在我开始播放文件之前,没有任何问题 请参阅下面的代码。你知道我为什么会这样吗 客户 uploadSong: (song) => { fetch('http://localhost:8080/son
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编码字符串 我将其追溯到我的客户机代码,该代码使用以下方法读取文件: …结果属性包含数据作为URL,表示文件数据为base64编码的字符串
谜团解开了。现在我只需要弄清楚是在服务器上解码文件,还是使用一种文件读取器方法,而不是首先对其进行编码。使用此代码进行文件上载。这是服务器端代码。我把它命名为
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");
});
创建一个视图文件夹并将此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>
运行服务器a
节点server.js
。打开浏览器并运行此apihttp://localhost:3000/api/file
并选择任何可能的文件音频/视频/pdf/image等
。任何要上载到磁盘的文件。在这段代码中,我将文件上载到根项目文件夹中的public/uploads
。您可以将要存储上载文件的目标文件夹指定给您。希望这有帮助。为了帮助诊断,我建议创建一个大小类似的文本文件并上传。然后,您可以查看磁盘上文件的内容,了解它与您发送的文件的区别。我怀疑这行:body:song
。我的猜测是,这首歌并不是它应该是的样子。@skille这是个好主意。我试着上传一个测试文件,里面只写了“test”。生成的文件是:“data:text/plain;base63”,然后我检查了mp3文件。它读取:数据:文本/普通;base63的解决方案是直接将文件发送到服务器,而不读取它。这保留了默认编码。