我正在尝试接收视频文件并使用 multer 将其保存在服务器上

I am trying to receive video file and save it on the server with multer

我正在尝试使用 node、express 和 multer 接收视频文件并将其保存在具有正确扩展名的上传文件夹中。我知道我的视频已正确传递到服务器,但它并没有按照我希望的方式保存。这是我的后端代码。

var express = require("express");
var bodyParser = require("body-parser");
var multer = require("multer");
var app = express();
var path = require('path'); 

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// this is cors this allows my angular app to call this node backend even though they are both on local host 
app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});
// here I am calling multer to get the filename of the file I am serving up specifying what folder I want it to go in
 var storage = multer.diskStorage({
     destination: function (request, file, callback){
         callback(null, './uploads');
     }, 
     filename: function(request, file, callback){
         console.log(file); 
         callback(null, file.originalname)
     }
 }); 

 var upload = multer({storage: storage}); 
// this app.post calls the post method this is where I will upload the file
 app.post('/upload', function (request, response) {
     upload(request, response, function(err) {
         if(err) {
             console.log('Error Occured'); 
             return; 
         }
         console.log(request.file);
         response.end('Your file Uploaded'); 
         console.log('Video Uploaded'); 
     })
 }); 
// my app is listening on localhost port 8080 for the post to be called
 var server = app.listen(8080, function () {
     console.log('Listening on port ' + server.address().port) 
 }); 

这是我的错误

c:\toolbox\pos-estate-data\oneops\ScoSopBackend>node app.js
Listening on port 8080
TypeError: upload is not a function
    at c:\toolbox\pos-estate-data\oneops\ScoSopBackend\app.js:29:6
    at Layer.handle [as handle_request] (c:\toolbox\pos-estate-data\oneops\ScoSo
pBackend\node_modules\express\lib\router\layer.js:95:5)
    at next (c:\toolbox\pos-estate-data\oneops\ScoSopBackend\node_modules\expres
s\lib\router\route.js:131:13)

客户端代码

upLoad() {
    let strSopName : string = (<HTMLInputElement>document.getElementById("sopName")).value; 
    if(strSopName == "" || strSopName == null || strSopName == "Error you must enter a sop name"){
        strSopName = "Error you must enter a sop name"
        return;
    }

    this.makeFileRequest("http://localhost:8080/upload", [], this.filesToUpload).then((result) => {
        console.log(result); 
    }, (error) => {
        console.error(error);
    }); 

}

makeFileRequest(url: string, params: Array<string>, files: Array<File>){
    return new Promise((resolve, reject) => {
        var formData: any = new FormData(); 
        var xhr = new XMLHttpRequest(); 
        for(var i = 0; i < files.length; i++){
            formData.append("uploads[]", files[i], files[i].name); 
        }
        xhr.onreadystatechange = function() {
            if(xhr.readyState == 4){
                if(xhr.status == 200){
                    resolve(JSON.parse(xhr.response));
                }else {
                    reject(xhr.response); 
                }
            }
        }
        xhr.open("POST", url, true); 
        xhr.send(formData); 
    })
}

html

<br>
                <input type="file" (change)="fileChangeEvent($event)" name="videofile" placeholder="upload file..." class="form-control" id="Video" accept="video/mp4, video/x-m4v, video/*" required>
           <br>

您没有正确初始化 multerupload 中间件。这就是为什么经历 type error.

在你的情况下,你想上传单个文件,尝试以下初始化并将 'file' 替换为 input nameform[=30 中的文件相关=]

例如,

您的 html

form 中有 type="file"input 标签和 name="videoFile"
<form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="videoFile"><br>
    <input type="submit" value="Submit">
</form>

然后,你可以初始化multer来拉取file

var upload = multer({storage: storage}).single('videoFile');

请注意,接收 file 的是 input 标签的名称,而不是 filename 本身。

编辑

如评论中所述,您正在上传多个文件。 尝试

var upload = multer({storage: storage}).array('uploads'); 

希望对你有帮助。