当一个已存在时,Multer尝试创建一个新文件夹

时间:2018-01-22 23:15:27

标签: javascript express heroku multer

我正在使用Multer来管理图片上传,当在我的本地计算机上运行我的应用程序时,一切都运行良好。但是现在我正在尝试部署到Heroku,我在应用程序日志中遇到了这个错误:

  

未处理的拒绝错误:EROFS:只读文件系统,mkdir   '/公共'

...这似乎是在尝试创建目录而不是使用现有目录(就像在本地计算机上一样)

这是我用于Multer的代码:

var storage = multer.diskStorage({
  destination: (req, file, cb) => {
      cb(null, 'public/img/')   },
  filename: (req, file, cb) => {
    cb(null, new Date().toISOString() + file.originalname)
} })

var upload = multer({storage: storage})


router.post('/:propertyid', upload.single('img'), function(req, res) {
  Property.update({
      img: req.file.filename
    }, {
    where: {
      id: req.params.propertyid,
   }
  }).then(updatedProperty => {
        res.redirect('/admin/' + updatedProperty)
  })
});

public / img目录已经存在,在测试时,它运行正常,文件名正确,最终位于正确的位置。任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:0)

Heroku dynos有一个短暂的文件系统。 Naaman Newbold的回答This,很好地解释了这意味着什么。

TL; DR: DYNOS'文件系统不应该用于存储除部署之外的任何永久存储或数据。为了使用存储空间AWS S3 can be used

答案 1 :(得分:0)

您可以使用fs-extra创建文件夹,它将同步并在下面的代码中创建文件夹,如下所示。我正在通过user_id创建目录并上传多张图片,因此我在自己的文件夹中使用了fs.mkdirsSync(path)代码

let fs = require('fs-extra');

let storage = multer.diskStorage({
destination: function (req, file, cb) {
    let Id = req.body.id;
    let path = `tmp/daily_gasoline_report/${Id}`;
    fs.mkdirsSync(path);
    cb(null, path);
},
filename: function (req, file, cb) {
    // console.log(file);

    let extArray = file.mimetype.split("/");
    let extension = extArray[extArray.length - 1];
    cb(null, file.fieldname + '-' + Date.now() + "." + extension);
}
})