【问题标题】:Multer is storing in local AppData and not in specified directoryMulter 存储在本地 AppData 中,而不是指定目录中
【发布时间】:2016-09-17 17:24:02
【问题描述】:

我将 Multer 与我的 MEAN2 堆栈一起使用,并且通过 ng2-uploader 可以正常上传文件。

但我正在尝试将其上传到服务器,这样我就可以将 csv 文件解析为 json,但这不是问题。

文件上传正常...但它上传到AppData\Local\Temp,这是上传后的文件信息:

[ { fieldname: 'file',
    originalname: 'sfgsgsfrfs.jpg',
    encoding: '7bit',
    mimetype: 'image/jpeg',
    destination: 'C:\\Users\\Jezyk\\AppData\\Local\\Temp',
    filename: 'z83yrcprp4m8azfflxr.jpg',
    path: 'C:\\Users\\Jezyk\\AppData\\Local\\Temp\\z83yrcprp4m8azfflxr.jpg',
    size: 120850 } ]

这是我用来存储文件的代码:

const upload = multer({
    dest: './server/uploads/',
    storage: multer.diskStorage({
        filename: (req, file, cb) => {
            let ext = path.extname(file.originalname);
            cb(null, `${Math.random().toString(36).substring(7)}${ext}`);
        }
    })
});

router.route('/upload').post(upload.any(), (req, res) => {
    console.log(req.files);
    res.json(req.files.map(file => {
        let ext = path.extname(file.originalname);
        return {
            originalName: file.originalname,
            filename: file.filename
        }
    }));
});

知道为什么会这样吗?

【问题讨论】:

  • 你试过用绝对路径代替相对路径吗?
  • @mscdex 但是每次它在不同的地方供人们使用时都必须更改它,使用'./server/uploads'应该没问题???,但它只是忽略了'dest'值,是因为 fof multer.diskStorage 吗??
  • 这是一个测试,看看它是否有帮助。如果由于某种原因无法正确解析路径,您可以使用__dirname 帮助生成绝对路径(相对于脚本文件目录)。
  • @mscdex 啊,好吧,我明白了,我将 dest 更改为:dest: __dirname + '/server/uploads/',,然后我 console.logged __dirname 和 req.files 以确保其正常工作,结果如下: C:\Users\Jezyk\Desktop\Feedbacker [ { fieldname: 'file', originalname: 'freelance pay.txt', encoding: '7bit', mimetype: 'text/plain', destination: 'C:\\Users\\Jezyk\\AppData\\Local\\Temp', filename: '8cqvf7nn8v4e6401kyb9.txt', path: 'C:\\Users\\Jezyk\\AppData\\Local\\Temp\\8cqvf7nn8v4e6401kyb9.txt', size: 104 } ]
  • 你用的是什么版本的multer?

标签: node.js express multer


【解决方案1】:

如果使用显式配置的存储实例,则需要添加 destination 回调:

const upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, __dirname + '/server/uploads/')
    },
    filename: (req, file, cb) => {
      let ext = path.extname(file.originalname);
      cb(null, `${Math.random().toString(36).substring(7)}${ext}`);
    }
  })
});

【讨论】:

  • 仍然通过错误,我似乎已经摆脱了 multer.diskStorage 并且只有以下代码:const upload = multer({ dest: function (req, file, cb) { cb(null, path.join(__dirname + '/server/uploads')) }, filename: function (req, file, cb) { let ext = path.extname(file.originalname); cb(null, ${Math.random().toString(36).substring (7)}${ext}); } }); 但现在它正在生成不带扩展名的文件名 :S ` path: 'C:\\Users\\Jezyk\\Desktop\\Feedbacker\\server\\uploads\\2a7c9594a1be1150512b53de5da707ab ',`
  • 我应该坚持使用 file.originalname 来保存文件,而不是生成随机名称吗?即cb(null, file.originalname) 用于文件名部分?编辑:说我这样做了,它仍然在为没有分机的文件生成随机名称:S
  • 您最好不要使用原始文件名的任何部分,除非出于安全目的。此外,文件类型(和 mime 类型)可能与文件扩展名不匹配,因此保留它甚至更没有意义(尽管您可以使用 mmmagic 模块之类的东西检查文件内容以尝试验证文件格式,如果你需要的话)。
猜你喜欢
  • 2017-10-17
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2011-01-02
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多