【问题标题】:Error uploading files using Multer in NodeJs在 NodeJs 中使用 Multer 上传文件时出错
【发布时间】:2017-10-09 03:40:52
【问题描述】:

我正在尝试编写一个基于 Express 的 API 来上传文件。文件名和目录路径应动态设置。

我的代码:

var crypto = require('crypto')
var express = require('express');
var fs = require('fs');
var mime = require('mime');
var mkdirp = require('mkdirp');
var multer = require('multer');

var app = express();
var path = './uploads'; 

var storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, path);
        console.log('Im in storage destination'+path);
    },
    filename: function (req, file, callback) {
        console.log('Im in storage filename'+path);
        //callback(null, file.fieldname + '-' + Date.now());
        crypto.pseudoRandomBytes(16, function (err, raw) {
            callback(null, Date.now() + '.' + mime.extension(file.mimetype));
        });
    }
});

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

app.post('/photo',function(req,res){
    path += '/pics/shanmu/';
    console.log('Im in post , outside upload'+path);

    upload(req,res,function(err) {
        console.log('Im in post , inside upload'+path);
        if(err) {
            return res.end('Error uploading file.');
        }
        res.end('File is uploaded'+path);
        console.log('File is uploaded'+path);
    });
});

app.listen(3000,function(){
    console.log('Working on port 3000');
});

我的文件夹结构:

当我运行代码时,文件应该上传到uploads/ 文件夹中。 (这个文件夹里面有两个嵌套文件夹 - uploads/pics/shanmu)。

当我从邮递员触发它时,它只工作一次。当我第二次尝试时,我无法上传文件。

请指教。

【问题讨论】:

    标签: node.js express postman multer


    【解决方案1】:

    在某个时候我得到了一个使用 multer 模块的解决方案。使用此模块,您可以上传文件和图像。并且它成功上传到目标文件夹。

    这是我的服务器代码app.js

    var express =r equire('express');
    var multer = require('multer');
    var path = require('path')
    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')//here you can place your destination path
        },
        filename: function(req, file, callback) {
            callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
        }
    })
    
    app.get('/api/file',function(req,res){
    res.render('index');
    });
    app.post('/api/file', function(req, res) {
        var upload = multer({
            storage: storage}).single('userFile');
        upload(req, res, function(err) {
            console.log("File uploaded");
            res.end('File is uploaded')
        })
    })
    
    app.listen(3000,function(){
    console.log("working on port 3000");
    });
    

    创建一个views 文件夹并将此index.ejs 文件放入其中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form id="uploadForm" enctype="multipart/form-data" method="post">
            <input type="file" name="userFile" />
            <input type="submit" value="Upload File" name="submit">
        </form>
    </body>
    </html>
    

    在此之后以node app.js 运行服务器。打开浏览器并在运行此网址后键入http://localhost:3000/api/file 选择要上传到目标文件夹的文件。并且在终端和浏览器中都有成功的响应。希望这个对你有帮助。

    【讨论】:

      【解决方案2】:

      我让你的代码工作了。见:

      https://gist.github.com/lmiller1990/3f1756efc07e09eb4f44e20fdfce30a4

      我认为问题在于您声明 destination 的方式。不过,我不确定为什么。我只是通过将路径作为字符串传递来让它工作。

      祝你好运!

      【讨论】:

      • 如果表单中有文本字段怎么办?即我正在寻找我们必须执行数据库查询,并根据该结果,使用 multer 执行上传操作。
      猜你喜欢
      • 2017-03-29
      • 1970-01-01
      • 2018-04-24
      • 2018-07-21
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多