【问题标题】:File uploads but the multer code is not executed | Node + multer + express + formdata文件上传但multer代码未执行| Node + multer + express + formdata
【发布时间】:2020-10-12 05:53:08
【问题描述】:

我正在使用formmulterexpressnodejs 将视频文件上传到本地文件夹。

视频文件被上传到本地文件夹 - 每次我通过表单上传它。但是,upload 中的代码只是偶尔执行。 5 次一次。即console.log('33'); 内的app.post 并不总是被打印出来。但是,console.log('1')postupload 之前的那个)每次都有效。

server.js代码

var Express = require('express');
var multer = require('multer');
var mkdirp = require('mkdirp');
var app = Express();

var cors = require('cors');    
app.use(cors());
    
var Storage = multer.diskStorage({
        destination: function(req, file, cb) {
        var dir = './client/public/video/';
        mkdirp(dir, function(err) {
        if(err) {
            console.error(err);
        }
        cb(null, dir);
    });
    console.log("Upload: saved to " + dir + file.originalname);
    },
        filename: function(req, file, callback) {
        callback(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
    }
});

var upload = multer({
    storage: Storage
  }).single("file");


app.post("/api", function(req, res) {
    console.log('1');

    upload(req, res, function(err) {
    console.log('33');
    if (err) {
             return res.end("Something went wrong!");
         }

    return res.status(200).end("File uploaded successfully!.");
  });

 });

var server = app.listen(9000, function () {
  console.log('app listening at 9000');
});

app.js代码

import React, { Component } from "react";

import axios from "axios";

class App extends Component {
    state = {
        file: null
    };

    handleOnChange = e => this.setState({ [e.target.name]: e.target.value });

    handleOnUploadFile = e => this.setState({ file: e.target.files[0] });

    handleOnSubmit = e => {
        e.preventDefault();
        const formData = new FormData();

        formData.append("file", this.state.file);
        
        axios
        .post("http://localhost:9000/api", formData, {
         headers: {
            'accept': 'video/mp4',
    'Accept-Language': `en-US,en;q=0.8`,
    'Content-Type': `multipart/form-data; boundary=${formData._boundary}`,
         }  
        })
        .then(res => console.log(res.data))
        .catch(err => console.error(err));
    };

    render() {
        return (
                <form>
                    <input type="file" encType="multipart/form-data"
                    name="file"
                    accept="video/mp4"
                   onChange={this.handleOnUploadFile}/>
                
                    <button type="submit" className="btn btn-danger" onClick={this.handleOnSubmit}>
                        Submit
                    </button>
                </form>
            );
        }
}

export default App;

我是 react/node js 的新手。尝试了很多其他帖子的建议,但找不到解决方案。

【问题讨论】:

    标签: node.js reactjs forms express multer


    【解决方案1】:

    尝试添加asyncawait

    server.js

    var Express = require('express');
    var multer = require('multer');
    var mkdirp = require('mkdirp');
    var app = Express();
    
    var cors = require('cors');    
    app.use(cors());
        
    var Storage = multer.diskStorage({
            destination: function(req, file, cb) {
            var dir = './client/public/video/';
            mkdirp(dir, function(err) {
            if(err) {
                console.error(err);
            }
            cb(null, dir);
        });
        console.log("Upload: saved to " + dir + file.originalname);
        },
            filename: function(req, file, callback) {
            callback(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
        }
    });
    
    var upload = multer({
        storage: Storage
      }).single("file");
    
    
    app.post("/api", function(req, res) {
        console.log('1');
    
        upload(req, res, function(err) {
        console.log('33');
        if (err) {
                 return res.end("Something went wrong!");
             }
    
        return res.status(200).end("File uploaded successfully!.");
      });
    
     });
    
    app.get("/", function(req, res) {
      console.log('1');
    
      return res.status(200).json({});
    });
    
    var server = app.listen(9900, function () {
      console.log('app listening at 9900');
    });
    

    App.js

    import React, { Component } from "react";
    
    import axios from "axios";
    
    class App extends Component {
        state = {
            file: null
        };
    
        handleOnChange = e => this.setState({ [e.target.name]: e.target.value });
    
        handleOnUploadFile = e => this.setState({ file: e.target.files[0] });
    
        handleOnSubmit = async e => {
            e.preventDefault();
            const formData = new FormData();
    
            formData.append("file", this.state.file);
            
            await axios
            .post("http://localhost:9900/api", formData, {
             headers: {
                'accept': 'video/mp4',
        'Accept-Language': `en-US,en;q=0.8`,
        'Content-Type': `multipart/form-data; boundary=${formData._boundary}`,
             }  
            })
            .then(res => console.log(res.data))
            .catch(err => console.error(err));
        };
    
        render() {
            return (
                <>
                    <h1>{"<b>hello</b>".bold()}</h1>
                    <form>
                        <input type="file" encType="multipart/form-data"
                        name="file"
                        accept="video/mp4"
                       onChange={this.handleOnUploadFile}/>
                    
                        <button type="submit" className="btn btn-danger" onClick={this.handleOnSubmit}>
                            Submit
                        </button>
                    </form>
                </>
                );
            }
    }
    
    export default App;
    

    【讨论】:

    • 可能是别的东西,但我测试并打印了预期的结果:1 Upload: saved to ./client/public/video/tf_java_api.mp4 33
    • 您上传的视频文件大小是多少?我的文件大小约为 50MB。尝试上传一个 4MB 的文件。然后将33 作为输出。上传 50MB 文件时不会。 app listening at 9000 1 Upload: saved to ./client/public/video/2019-10-13-213106.mp4 33 1 Upload: saved to ./client/public/video/2019.mp4 1 Upload: saved to ./client/public/video/2019.mp4 2019.mp4 大小为 50MB。根据 multer 文档,文件大小可以是 infinity
    • 我使用了一个 212 MB 的 .mp4 文件。
    【解决方案2】:

    尝试为您的上传功能使用承诺:

    var Express = require('express');
    var multer = require('multer');
    var mkdirp = require('mkdirp');
    var app = Express();
    
    var cors = require('cors');    
    app.use(cors());
        
    var Storage = multer.diskStorage({
            destination: function(req, file, cb) {
            var dir = './client/public/video/';
            mkdirp(dir, function(err) {
            if(err) {
                console.error(err);
            }
            cb(null, dir);
        });
        console.log("Upload: saved to " + dir + file.originalname);
        },
            filename: function(req, file, callback) {
            callback(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);
        }
    });
    
    var upload = multer({
        storage: Storage
      }).single("file");
    
    
    app.post("/api", function(req, res) {
        console.log('1');
        
        upload(req, res).then((file, err) => {
        console.log('33');
        if (err) {
                 return res.end("Something went wrong!");
             }
    
        return res.status(200).end("File uploaded successfully!.");
        })
    
    
    
     });
    
    var server = app.listen(9000, function () {
      console.log('app listening at 9000');
    });

    另一个想法是将上传本身包装在一个承诺中:

    var Storage = multer.diskStorage({
    return new Promise((resolve, reject) => {
        destination: function(req, file, cb) {
                var dir = './client/public/video/';
                mkdirp(dir, function(err) {
                if(err) {
                   reject(err)
                }
                cb(null, dir);
            });
            console.log("Upload: saved to " + dir + file.originalname);
            },
                filename: function(req, file, callback) {
                resolve(callback(null, file.fieldname + "_" + Date.now() + "_" + file.originalname);)
            }
        })
        });
    

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 2019-05-01
      • 2017-11-12
      • 2015-10-14
      • 2016-03-09
      • 1970-01-01
      • 2015-10-21
      • 2020-05-03
      • 1970-01-01
      相关资源
      最近更新 更多