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

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

res.sendFile() is supported by Express v4.8.0 onwards.

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

属性

+dNzre7mXIl7bq1aoqS3kA==

描述

P1A+i8ahhIz44bL7ViXTqg==

默认

QO2xNQUQ4kddN8g+/azLhA==

可用性

1ECvQG2PqvlXgCWGsvXN3g==

maxAge设置 Cache-Control 标头的 max-age 属性(以毫秒为单位)或 ms 格式 中的字符串

L9w5awOlQYCgGQpwjzCl9jFMpfRRXDPmke+CIMydguoWYxYFyBiMB/ILHgBuhVVo0vDPunvNwKuxgm9TYK+xWR+VNijQEuPc6pNQ/zLf4FLUTRyrHa6l0lrJSnyJG06JjmilozVgEdCtLn2DvmlTbnma2ioUggpK3Jn02uw9IHQjnFXQ6SF7+CgbKvZ4cH3Govgf3ZluPdPFEdFobvAEdg==

0
root相对文件名的根目录。

K/lpuBs0veyM9nNMxi7IoNs7ELINRml3hbiQG7JVWe8J8LkS0gTqLk3O1TxFQ/bu

lastModifiedLast-Modified 标头设置为操作系统上文件的最后修改日期。设置 false 以禁用它。

JHTy5czvCjJzS/tT1C3QXlw2JiSnxblLIsxMKjLUp7u3cTJNJXRoNDXXQmkR6tSfkiPgLyJND823xmIaL8Rjej6TSAXkocPjJlmkeUYbgmZaBIdbnZz/yozJY+xOHzfch5PGA9uW4tv6VDaaeo4PeKjv7bn9TkVix3GboQEJ58BM67BDyDiiJrmEBclbz9ci

启用

/IpqU02DtJh6aw3FiQbmPg==

4.9.0+
headers包含与文件一起服务的 HTTP 标头的对象。

bS9qAHNVcHIShbTooFHnpBB5rv+9gujYnzW2jU1NODl+NakE5gz0Gve1l8Zhpt9d58lWj/M4ibVsW6LAUuZHBQ==

dotfiles提供点文件的选项。可能的值为 "allow"、"deny"、"ignore"。

5y836MOvSxYYD3V2c2bKYKvbHqnVvrXs8YBzowc+RcOig6p7mRCpM+Weec0Pk1y7Ftc8l7fROUbFlqQ2XaCnXZQ1ZUcM+fE5mRppi21BEtw=

"ignore" 
acceptRanges启用或禁用接受范围请求。

4z+1/trYKT2zxpMMjeo1M9UZBNS1mcZeTo0sO+ZZ1OnbN+TDf7OWsWTlL0+5aGQb

true4.14+
cacheControl启用或禁用设置 Cache-Control 响应标头。

4z+1/trYKT2zxpMMjeo1M6hXC9Lp4zmm04+mgenYHUTuqM4Iife1UaWAjxv56PJMmuGbW7OeuTtXk4jsrcuNM0l+qTb+/gNhRKhxeAI6obM=

true4.14+
immutableCache-Control 响应标头中启用或禁用 immutable 指令。如果启用,还应指定 maxAge 选项以启用缓存。immutable 指令将阻止受支持的客户端在 maxAge 选项的生命周期内发出条件请求以检查文件是否已更改。

4z+1/trYKT2zxpMMjeo1M3QlH7sCfEQ9UlNhpZy+4CAS5MyatFgJI8Pqm6jrj0mjaMnRCb1+8AGKOcr4BO3TE7WMjz9RrwaPCeXTbRCWPvPMl7quPrhFbRKN9Ki8s1z6r/w3d5AT2eND2sYLZZcdlkUT/veeIyfTW5SXU4Jbrm5JGxrgRbsBgwQmY8hxz9Nh4ADV8+hTqaFAYBfctjrp8BTyMZsVsa+C7lZuEwa543KpgIH3sUEWaBtFa1aq5zsw24Dysp0tnfK03izqt2moGtFJYZu3OBPlWwLvIRl5q9b66fTt5E1HcgKqnlDcocnkJ7H3MNGO34K1U+xRrF/9eddE1u0k5rA74bAkLZoK5W2kKw7Hc5IpwczcMFGwtcwn4ToMej8t1shfCUe0fv1aQaZMdb76EvOHqRF0NEq2lJdkFzHxCGi2nh8XaA5ci9eBTYduL5LUQS43uo8DymQuWGVlp1hjPE7z9ijcFM41REYNfGyHMNC+XY4ujewz6/t3

false4.16+

Kz2IqoH/zWAhjDS8wqNvxEou0iqXkUt8eRfMkzvZYtRwHjEapRcpusMhIX7pkXHnm7Kzb+ni8SAgUrj9QDcGUpfFNPsWLU2SxFA+KUEzjs1eqSg6Sd4DPJG6jdj08wNYGCdKPZWjpCiIuwzF/R5hZKlFfpRORiHJUikZJfDRjw6ridswrmnazScULj4fbvLLVGADr2M4wqpYrPD6ieRLdZaN5amkG2BvNVaCZGzsTjHJULsfqH7gvQQVVEx0hTneN7yfmhrjTpKBbLVq4mcjN1dT4RHko2gBXEf1N6ytbx9PMiHoY25hfvnInP7CAbTZxZJHqPs4Ou0tMIZoE3E2hfp2b6+8hiCWjdbfaAHviduVIOfqS7XMWcySFXTQI8od53A/sWJMLo8vjjQruOfKs2+dJhF4pPTBrpW9Tk0Iw6AgN1Ha0NhbPML6oN/3xyyN9l0+VujVm9gs8S0j/51UbGLtcakExrL1/qfhpSG+pwcoIeJY2vH8IzBIhd2aL8fQo0nXgqjcUbRGZhxP8sPIXIC20d2+bsvkkTdYPibRJ5nEsRddRhPu6XA3jQnP5zpQl7WE4RLDXer+1I4PemyA4VHtkCO4+/05e424dTIRw2bT73cz4zbYSg3yes/CrzIe7hsVh3pbIe0XEPArDBxLbJh8umibybbYbaH1weOe9rel25UMe3CW05szWWHoZNeFlacKWK+KH6GPIEhp5yHwRqUaTGN7gnCmH98qc/X7aeXmtMExAcGTttbxHtHaG28oxnpyKhBcScjKppxxBt2A7Pq28JNpf8MRm3jt4YB6mRI=

uPv4ce26A+WbtDRs64Ca/LbxYbc1wzSCCuTkBA2KTepwjhOz88bzA9qwsp0TJntVXOCWP9PMEdv0nS5gNsARiCpq7mtB4s0JI7TB6XTuoaxQkWj+uglIL5KB1HbJpX/3YqFNERLUoBNDthU6kkHUhimSK7VaR9/pL6GhZH65dr9FPGtPgaa+w3RTqSG6PI0CAWDB5vx9FOiFWPFlKteCm76OURvrt405FSn/PQ5PahQ=

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)
    }
  })
})

3wyPM8uMhWZdBuHEYlIdPUBeCwCMq2uF5mGN12gL99A6evg1taChLP0caTRBufS7XeMvGFWEH7jw6qt8s8mByvSXsZc3oIkfIjMeRv6hyR6+it1gLPaGiLNHA/n+k+6YBNqC0hnsWrYOExl6DE4ZLcV48YAHEwWkTC2WMZMKwvbuWJtApFZdKGeXmBCxCerTKGi5T7EwcKQdRavSenzlfdzOqQ2ooxLsh2+vCt0+7L9xKNKmN6cQshUkMrVrU9fRBXhZmfFO6WJJZKlYN47QRD/2uU0ve2PYiRi/nNAMmr729jiJv6Qe/PoAywB/279F

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.")
    }
  })
})

VOpt2GKAyCjreOARfUH+J4mbFcI4LGJ+UudBiPXWg1HoIuMzlOdZ2pHyQFvKVB0ZBGjQbMCazq65Mp8LehEZ6A3IoGtWVgorkPhuzzh+x7sV5oeku9oXYhVwATO6QMvZd350YfZtdsGbu26FAdOilpWpUG0GQc9HGaEOjofsZGKBiQaOLTbow3xi+tF6insti1WAMqiG44mPV7aftb6w63nM0qQ8VSgkTtYwjn4/fZ9KW7ZQWXsbzR7wgaKplQB3+6sW1bZ/C9tBYuAJpuIBTivAopf7tLXAqStWQ9eoA5C4evQ9905Kb1EkxKRO06RgHN8/2aOk2YvZ6s8TPyR+V/5seKJSycBTMErfhifSE+E=