我想将mp3, lrc, wav, txt
添加到服务器,文件夹名称将为title
,上面提到的所有扩展名都将具有指定的名称。如代码中所示,mp3将为"vocal.mp3"
。
addSong(event) {
jQuery('#addItemSave').text("Please wait!");
this._service.addSong(this.authorText, this.titleText, this.durationText, this.genre).subscribe(
res => {
this.data.push(res.data[0]);
this.addSongFilesToServer();
});
}
private addSongFilesToServer() {
this._service.addSongFilesToServer(this.titleText,
this.mp3file, this.lrcfile, this.pitchfile, this.thumbfile).subscribe(
res => {
console.log("Done! Now hide loading icon or what ever...");
jQuery('#addItemSave').text("Save");
jQuery('#addNewSongDialog').modal('hide');
jQuery('#addNewSongDialog').find("input,textarea,select")
.val('')
.end()
.find("input[type=checkbox], input[type=radio]")
.prop("checked", "")
.end();
});
}
addSongFilesToServer(title, mp3, lrc, txt, thumb) {
let url = this._config.ServerWithApiUrl + "uploadFiles";
let body : FormData = new FormData();
body.append('mp3', mp3, "vocal.mp3");
body.append('txt', txt, "pitches.txt");
body.append('lrc', lrc, "lyric.lrc");
body.append('thumb', thumb, "thumbnail.png");
body.append('title', title);
this._config.headers.delete('Content-Type');
return this._http.post(url, body, { headers: this._config.headers })
.map(res => res.json()).catch(function(err){
throw err;
});
}
当在页面上按下按钮并传递所有需要传递的文件时,将调用 addSong(event)
。这里唯一的问题是mp3, lrc, wav, txt
和所有文件夹都在不同的文件夹下,例如vocal.mp3
。
仅说明一下,这就是我现在所要获得的:
├───songs
│ ├───vocal
│ │ vocal.mp3
│ ├───pitches
│ │ pitches.txt
...
这就是我所需要的:
├───songs
│ ├───title
│ │ vocal.mp3
│ │ lyric.lrc
│ │ pitches.txt
...
服务器端:
Router.post('/uploadFiles', (req, res) => {
var title = req.body.title || "title";
var storage = multer.diskStorage({
destination: function (req, file, cb) {
var dir = "../songs/" + file.originalname.split('.')[0];
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
cb(null, dir);
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
});
var upload = multer({ storage : storage}).any();
upload(req,res,function(err){
if(err){
return res.status(500).send({
code: 500, message: 'could not upload file: ' + err, error: err });
}else {
return res.status(200).send({
code: 200, message: 'All files uploaded!', err: ""});
}
});
});
答案 0 :(得分:1)
您可以在示例中看到实际上是通过这种方式编码的
var storage = multer.diskStorage({
destination: function (req, file, cb) {
var dir = "../songs/" + file.originalname.split('.')[0];
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
cb(null, dir);
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
});
file.originalname.split('.')[0]
实际上是分割扩展名并采用文件名。
所以它将var dir = "../songs/" + title;
简单明了。
var storage = multer.diskStorage({
destination: function (req, file, cb) {
////////////////////////////
var dir = "../songs/" + title;
///////////////////////
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
cb(null, dir);
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
});
此外,body-parser
不处理多部分主体,这是FormData提交的形式。因此req.body.title
无法正常工作。
请检查以下内容以供参考:How to handle FormData from express 4
很可能您将需要通过其他方式发送title