# res.sendFile

在给定的 path 传输文件。

# 概要

res.sendFile(path [, options] [, fn])

# 描述

Express v4.8.0 及更高版本支持 res.sendFile()

在给定的 path 传输文件。根据文件名的扩展名设置 Content-Type 响应 HTTP 标头字段。除非在选项对象中设置了 root 选项,否则 path 必须是文件的绝对路径。

此 API 提供对正在运行的文件系统上的数据的访问。确保 (a) 将 path 参数构造为绝对路径的方式在包含用户输入时是安全的,或者 (b) 将 root 选项设置为目录的绝对路径以包含其中的访问。

当提供 root 选项时,允许 path 参数为相对路径,包括包含 ..。Express 将验证作为 path 提供的相对路径将在给定的 root 选项中解析。

下表提供了有关 options 参数的详细信息。

属性 描述 默认 可用性
maxAge 设置 Cache-Control 标头的 max-age 属性(以毫秒为单位)或 ms 格式 中的字符串 0
root 相对文件名的根目录。
lastModified Last-Modified 标头设置为操作系统上文件的最后修改日期。设置 false 以禁用它。 启用 4.9.0+
headers 包含与文件一起服务的 HTTP 标头的对象。
dotfiles 提供点文件的选项。可能的值为 "allow"、"deny"、"ignore"。 "ignore"
acceptRanges 启用或禁用接受范围请求。 true 4.14+
cacheControl 启用或禁用设置 Cache-Control 响应标头。 true 4.14+
immutable Cache-Control 响应标头中启用或禁用 immutable 指令。如果启用,还应指定 maxAge 选项以启用缓存。immutable 指令将阻止受支持的客户端在 maxAge 选项的生命周期内发出条件请求以检查文件是否已更改。 false 4.16+

该方法在传输完成或发生错误时调用回调函数 fn(err)。如果指定了回调函数并且发生错误,则回调函数必须通过结束请求-响应循环或将控制权传递给下一个路由来显式处理响应过程。

这是一个使用 res.sendFile 及其所有参数的示例。

app.get('/file/:name', (req, res, next) => {
  const options = {
    root: path.join(__dirname, 'public'),
    dotfiles: 'deny',
    headers: {
      'x-timestamp': Date.now(),
      'x-sent': true
    }
  }

  const fileName = req.params.name
  res.sendFile(fileName, options, (err) => {
    if (err) {
      next(err)
    } else {
      console.log('Sent:', fileName)
    }
  })
})

以下示例说明了使用 res.sendFile为服务文件提供细粒度支持:

app.get('/user/:uid/photos/:file', (req, res) => {
  const uid = req.params.uid
  const file = req.params.file

  req.user.mayViewFilesFrom(uid, (yes) => {
    if (yes) {
      res.sendFile(`/uploads/${uid}/${file}`)
    } else {
      res.status(403).send("Sorry! You can't see that.")
    }
  })
})

如需更多信息,或者如果您有问题或疑虑,请参阅 send

Last Updated: 3/22/2023, 7:27:28 PM