在流传输后删除文件时,“ EPERM:不允许操作,取消链接...”

时间:2018-11-02 01:22:54

标签: node.js windows express

我有一个用例,用户想要从服务器流式传输mp4文件,然后再删除该文件。

流式传输视频的代码非常简单且众所周知:

// Express.js
const fs = require('fs')
const { promisify } = require('util')

const stat = promisify(fs.stat)

// ...

router.get('/:sessionId', async (req, res) => {
  let filePath = '/some/file/path'

  const fileStat = await stat(filePath).catch(e => {
    console.error('Video not found!', e)
    return res.status(404).json({ message: 'Video not found!' })
  })

  try {
    const fileSize = fileStat.size
    const range = req.headers.range

    if (range) {
      const parts = range.replace(/bytes=/, '').split('-')
      const start = parseInt(parts[0], 10)
      const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1

      const chunksize = end - start + 1
      const file = fs.createReadStream(filePath, { start, end })
      const head = {
        'Content-Range': `bytes ${start}-${end}/${fileSize}`,
        'Accept-Ranges': 'bytes',
        'Content-Length': chunksize,
        'Content-Type': 'video/mp4',
        Connection: 'close'
      }

      res.writeHead(206, head)
      file.pipe(res)
    } else {
      const head = {
        'Content-Length': fileSize,
        'Content-Type': 'video/mp4'
      }
      res.writeHead(200, head)
      fs.createReadStream(filePath).pipe(res)
    }
  } catch (e) {
    console.error(e)
    res.status(500).json({ message: 'Server error when streaming the media' })
  }
})

要删除文件,我正在使用del软件包。

不幸的是,在浏览器中打开视频流,将其关闭并尝试删除视频后,我收到错误消息:EPERM: Operation not permitted, unlink...

在Windows资源监视器中,即使浏览器选项卡已经关闭,我仍认为应该停止读取流,但我仍可以在2个node.exe进程中打开该文件。除实际视频外,所有文件均从目录中删除,无法手动打开,因为它在Media Player中显示了类似的错误:Windows Media Player cannot access the file. The file might be in use, you might not have access to the computer where the file is stored, or your proxy settings might not be correct. 删除文件的唯一方法是重新启动服务器,然后尝试在不启动流的情况下进行删除。

我找不到任何可能的解释,为什么流没有关闭并阻止删除文件。我猜想Windows上肯定有内存泄漏或某种文件权限错误,但是不幸的是,我无法在其他平台上尝试此项目。该文件存储在%LOCALAPPDATA%的子文件夹中。

任何帮助将不胜感激。

我正在Windows 7上运行32位Node 10.13.0(业务要求)。

0 个答案:

没有答案