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相对文件名的根目录。
lastModifiedLast-Modified 标头设置为操作系统上文件的最后修改日期。设置 false 以禁用它。启用4.9.0+
headers包含与文件一起服务的 HTTP 标头的对象。
dotfiles提供点文件的选项。可能的值为 "allow"、"deny"、"ignore"。"ignore" 
acceptRanges启用或禁用接受范围请求。true4.14+
cacheControl启用或禁用设置 Cache-Control 响应标头。true4.14+
immutableCache-Control 响应标头中启用或禁用 immutable 指令。如果启用,还应指定 maxAge 选项以启用缓存。immutable 指令将阻止受支持的客户端在 maxAge 选项的生命周期内发出条件请求以检查文件是否已更改。false4.16+

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

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

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

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

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

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

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

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