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 | ||
lastModified | 将 Last-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 | true | 4.14+ |
cacheControl | 启用或禁用设置 Cache-Control 响应标头。4z+1/trYKT2zxpMMjeo1M6hXC9Lp4zmm04+mgenYHUTuqM4Iife1UaWAjxv56PJMmuGbW7OeuTtXk4jsrcuNM0l+qTb+/gNhRKhxeAI6obM= | true | 4.14+ |
immutable | 在 Cache-Control 响应标头中启用或禁用 immutable 指令。如果启用,还应指定 maxAge 选项以启用缓存。immutable 指令将阻止受支持的客户端在 maxAge 选项的生命周期内发出条件请求以检查文件是否已更改。4z+1/trYKT2zxpMMjeo1M3QlH7sCfEQ9UlNhpZy+4CAS5MyatFgJI8Pqm6jrj0mjaMnRCb1+8AGKOcr4BO3TE7WMjz9RrwaPCeXTbRCWPvPMl7quPrhFbRKN9Ki8s1z6r/w3d5AT2eND2sYLZZcdlkUT/veeIyfTW5SXU4Jbrm5JGxrgRbsBgwQmY8hxz9Nh4ADV8+hTqaFAYBfctjrp8BTyMZsVsa+C7lZuEwa543KpgIH3sUEWaBtFa1aq5zsw24Dysp0tnfK03izqt2moGtFJYZu3OBPlWwLvIRl5q9b66fTt5E1HcgKqnlDcocnkJ7H3MNGO34K1U+xRrF/9eddE1u0k5rA74bAkLZoK5W2kKw7Hc5IpwczcMFGwtcwn4ToMej8t1shfCUe0fv1aQaZMdb76EvOHqRF0NEq2lJdkFzHxCGi2nh8XaA5ci9eBTYduL5LUQS43uo8DymQuWGVlp1hjPE7z9ijcFM41REYNfGyHMNC+XY4ujewz6/t3 | false | 4.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=