首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试接收视频文件,并将其保存在与multer一起的服务器上。

我正在尝试接收视频文件,并将其保存在与multer一起的服务器上。
EN

Stack Overflow用户
提问于 2016-12-20 02:26:46
回答 1查看 8.7K关注 0票数 0

我正在尝试接收一个视频文件,并使用节点、express和multer将其保存在具有正确扩展名的上载文件夹中。我知道我的视频被正确地传送到服务器,但它并没有挽救我想要的。这是我的后端代码。

代码语言:javascript
复制
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) 
 }); 

这是我的错误

代码语言:javascript
复制
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)

客户端代码

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-20 03:18:34

您没有正确地初始化multerupload中间件,这就是体验type error的原因。

在您的示例中,您希望上载单个文件,尝试进行以下初始化,并将'file'替换为与form中的文件相关的input name

例如,

在您的input中有type="file"name="videoFile"标记和formname="videoFile"标记

代码语言:javascript
复制
<form method="post" action="/upload" enctype="multipart/form-data">
    <input type="file" name="videoFile"><br>
    <input type="submit" value="Submit">
</form>

然后,您可以初始化multer以提取file

代码语言:javascript
复制
var upload = multer({storage: storage}).single('videoFile');

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

编辑

正如注释中所讨论的,您正在上载多个文件。试一试

代码语言:javascript
复制
var upload = multer({storage: storage}).array('uploads'); 

希望它能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41233966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档