【问题标题】:Deleting Multer uploads object after processing Express处理 Express 后删除 Multer 上传对象
【发布时间】:2020-09-11 16:58:34
【问题描述】:

我正在尝试删除在uploads folder 中创建和存储的文件对象。

这是我的 multer 配置选项:

const path = require('path')

multerConfigOpt = {
    dest: 'uploads/',
    fileFilter:  function(req, file, cb) {
        var ext = path.extname(file.originalname)
        console.log(ext);
        if (ext === '.pdf' || ext === '.doc' || ext === '.docx' || ext === '.txt') {
            console.log("true!");
            cb(null,true)
        } else {
            cb(null, false)
        }
    }
}

module.exports = multerConfigOpt

处理用户通过 HTML 表单提交的文件后,我想将其删除。当我尝试执行以下操作时:

    await fs.unlink(this.file.path, (err) => {
        if (err) {
            console.log(err);
        }
    })

但是我收到以下错误:

Error: EPERM: operation not permitted,

这些存储在上传文件夹中的文件没有扩展名。我相信它们只是 multer 创建的二进制文件。

以下是上传文件夹路径中的文件示例。

我对文件所做的只是使用 nodemailer 通过电子邮件将其作为附件发送

if (this.file && this.isJobSeeker) {
    mailOptions.attachments = [{
        filename: 'resume.pdf',
        content:  fs.createReadStream(this.file.path)
    }]
}

如何删除这些文件?

感谢您的帮助。

【问题讨论】:

  • “处理”您的文件是否会导致将文件读入内存?
  • @AnujPancholi 我已经更新了我之前的问题,以展示我如何处理处理
  • 你能检查一下this.file.path 是什么吗?看起来像文件夹而不是文件。因此出现EPERM 错误。或者fs.unlink 找不到这个文件。
  • 我想你可以在这个链接上找到解决方案stackoverflow.com/a/63895045/12761193

标签: node.js express multer


【解决方案1】:

createReadStream function in fs 也可以将缓冲区作为输入,但是,fs.createReadStream() 似乎将该缓冲区转换为最终必须包含文件路径的字符串(这似乎是他们应该在文档)。

Multer 有一个功能,可以将文件存储在您的磁盘上,而不是存储在您的磁盘上,you can have the file as an in-memory buffer

你可以试试:

const multerMemoryStorage = multer.memoryStorage();

multerConfigOpt = {
    storage: multerMemoryStorage,
    fileFilter:  function(req, file, cb) {
        var ext = path.extname(file.originalname)
        console.log(ext);
        if (ext === '.pdf' || ext === '.doc' || ext === '.docx' || ext === '.txt') {
            console.log("true!");
            cb(null,true)
        } else {
            cb(null, false)
        }
    }
}

然后,如果您在处理函数中使用req.file 中的this.file,则可以执行以下操作:

使用nodejs中的stream module,我们可以将缓冲区转换成readable流,它是fs.ReadStream的基类。

const stream = require('stream')
const getNewReadableStreamFromBuffer = (inputBuffer) => {
    const readable = new stream.Readable.from(inputBuffer);
    

    return readable;
}
if (this.file && this.isJobSeeker) {
    mailOptions.attachments = [{
        filename: 'resume.pdf',
        content: getNewReadableStreamFromBuffer(this.file.buffer)
    }]
}

该文件无需删除,因为它从未保存到磁盘。并且由于 nodejs 被垃圾回收,缓冲区应该从内存中清除。

注意: Multer 文档在警告中提到,在这种方法中,您必须确保您的服务器有足够的内存来保存上传文件的内存缓冲区,因为某些文件可能非常大。如果您的文件足够小,它将顺利运行。

【讨论】:

  • 我已经尝试了你的建议。但是,当我使用 fs.createReadStream(this.file.buffer) 时,我收到错误 UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_VALUE]: The argument 'path' must be a string or Uint8Array without null bytes. Received <Buffer 25 50 44 46 2d 31 2e 37 0d 0a 25 b5 b5 b5
  • 我被 nodejs 文档误导了,但是,我已经修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2017-03-01
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多