【问题标题】:Nodejs Multer diskStorage not working - why destination targeting temp folder and not uploadingNodejs Multer diskStorage不工作 - 为什么目标定位临时文件夹而不上传
【发布时间】:2019-02-11 20:01:28
【问题描述】:

我正在使用 Multer 上传个人资料图片,但很遗憾无法正常工作。这是我的代码:

var express =   require("express");
var multer  =   require('multer');
var app         =   express();
var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './public/uploads');
  },
  filename: function (req, file, callback) {
    callback(null, file.fieldname + '-' + Date.now());
  }
});
var upload = multer({ storage : storage}).single('avatar');

exports.uploadAvatar = function(req, res) {
    console.log(req.files);
    upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
};

还有路线:

app.post('/api/uploadAvatar', requiredAuthentication, routes.api.instructor.uploadAvatar);

这是我的表格:

<form method="post" id="editProfile" enctype="multipart/form-data" action="/api/uploadAvatar">
    <div class="form-group">
        <label>Profile image <span>*</span></label>
        <input type="file" name="avatar" class="form-control" id="avatar" required />
    </div>
    <div class="form-actions">
        <button type="submit" class="button" id="btnSubmit">Upload</button>
    </div>
</form>

这是console.log(req.files); 正在记录的内容:

如您所见,destination 以“Temp”文件夹为目标,并且未生成文件名。有人可以找出这里出了什么问题吗?

请注意,我使用的是 keystoneJS 框架,但我相信它不会对此产生任何影响。

【问题讨论】:

  • 你使用的是什么版本的 KeystoneJS 和 Multer?
  • @Stennie KeystoneJS - 4, NodeJS - 10.5, Multer - 1.3

标签: node.js multer keystonejs


【解决方案1】:

同样的问题(REST-API、Node.js、Postman、POST 请求、上传图片、multer):

("multer": "^1.4.2")

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, './upload');
    },
    filename: function (req, file, cb) {
        return cb(null, file.originalname)
    }
});

但这有效:

const storage = multer.diskStorage({
    destination: './upload',
    filename: function (req, file, cb) {
        return cb(null, file.originalname)
    }
});

【讨论】:

    【解决方案2】:

    试试这个,

    var express =   require("express");
    var multer  =   require('multer');
    var app         =   express();
    var storage =   multer.diskStorage({
      destination: function (req, file, callback) {
        callback(null, './public/uploads');
      },
      filename: function (req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now());
      }
    });
    var upload = multer({ storage : storage}).single('avatar');
    
    module.exports. = { uploadAvatar: upload };
    

    这可能有效。

    【讨论】:

    • 谢谢,但这对我的问题没有帮助。现在我开始认为 KeystoneJS 正在覆盖某些东西
    【解决方案3】:

    在我的所有节点 API 中,我以这种方式使用了 multer,并且一直以来它对我来说都很好。

    var storage = multer.diskStorage({
      destination: function(req, file, callback) {
        callback(null, './uploads')
      },
      filename: function(req, file, callback) {
        console.log(file)
        callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
      }
    })
    

    更多详情请看Link

    希望它也可以帮助你。

    【讨论】:

    • 谢谢,但这对我的问题没有帮助。现在我开始认为 KeystoneJS 正在覆盖某些东西
    【解决方案4】:

    我不知道您的应用程序的文件夹结构,但您选择的路径似乎是针对公用文件夹的父级。您可以复制公用文件夹的相对路径并添加到其他文件夹,或者我认为 /public/whatever 可能会对您有所帮助

    还要引用图像,如果它是您的静态文件夹,您必须从您的公共文件中调用它。 所以 src 路径来自静态文件夹,所以你不需要添加它

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 1970-01-01
      • 2015-06-12
      • 2020-03-13
      • 2018-12-19
      • 2018-08-12
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多