我正在构建一个移动音乐应用程序,该应用程序使用Expressjs API,但无法通过流向客户端发送歌曲。
我的快速应用中有一条songs
路线:
import express from 'express'
import fs from 'fs'
const router = express.Router()
router.get(
'/:fileName',
async (req: express.Request, res: express.Response) => {
try {
const { fileName } = req.params
const filePath = `music/${fileName}`
const stream = fs.createReadStream(filePath)
const stat = fs.statSync(filePath)
res.set('Content-Disposition', `attachment; filename="${filePath}"`)
res.set('Content-Range', `bytes ${0}-${stat.size - 1}/${stat.size}`)
res.set('Content-Length', `${stat.size}`)
res.set('Content-Type', 'audio/mpeg')
res.set('Accept-Ranges', 'bytes')
stream.pipe(res)
} catch (err) {
res.status(400).send(err)
}
}
)
module.exports = router
我的移动应用程序是使用React构建的,并使用react-native-track-player
。
由于某些原因,不仅在我的移动应用程序中,而且在浏览器甚至PostMan中都没有播放音频
在浏览器中:
在PostMan中,它还要求我下载.mpga
文件:
如果从Google云端硬盘获取另一个链接,则该音频可以播放,并且可以在我的移动应用中使用。
PostMan上的Google Drive链接:
我坚持了好几个星期。知道如何解决吗?谢谢你。
使用ogg
文件,流可以正常工作。
我想知道为什么mp3
不支持。如果您有任何想法,请告诉我。
答案 0 :(得分:0)
您应该必须在参数中访问变量
req.params
应转换为
req.params[0]
以访问从params传递的文件。 如Express API中所述:
// GET /file/javascripts/jquery.js
console.dir(req.params[0])
// => 'javascripts/jquery.js'
答案 1 :(得分:0)
您处理内容范围的方式是错误的。
res.set('Content-Range', `bytes ${0}-${stat.size - 1}/${stat.size}`)
您已经对开始范围进行了硬编码,但通常情况下,请求的范围并不总是始于0
。
在这种情况下,我强烈建议您简单地使用express.static()
,甚至是像Nginx这样的常规Web服务器。它已经为您完成了工作。
此外,您的代码还有一个严重的安全漏洞,即任何人都可以通过传递相对路径../../../etc
来基本上请求硬盘上的任何文件。