我正在使用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目录已经存在,在测试时,它运行正常,文件名正确,最终位于正确的位置。任何帮助表示赞赏!谢谢!
答案 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);
}
})