请教一下大家关于Koa视频文件以流的形式返回给前端的问题

发布于 2022-09-12 00:27:05 字数 1670 浏览 16 评论 0

//这是上传视频文件的代码
@Post('/uploadVideo') uploadVideo(context: Koa.DefaultContext, next: Koa.Next) {
    if (context.request.files) {
        let src = 'http://127.0.0.1:80/uploadVideo/'
        for (let key in context.request.files) {
            let filename = context.request.files[key].path.split('uploadVideo\\')[1]
            return context.body = {
                code: 0,
                message: 'success',
                data: {
                    url: src + filename
                }
            }
        }
    }
    context.body = {
        code: -1,
        message: 'upload error'
    }
}

一开始我用的是 koa-static 静态文件代理的 /uploadVideo 接口返回视频文件路径,但是会出现以下错误:

Error: write ECONNRESET  
code:"ECONNRESET"  
errno:"ECONNRESET"  
headerSent:true  
message:"write ECONNRESET"

查了半天资料说是请求超时了才会出现这种情况,之后我将视频文件的代理换成了读写流:

app.use(async (context: Koa.DefaultContext, next: Koa.Next) => {
    if (context.method === 'GET' && (context.request.url as string).includes('/uploadVideo')) { //判断是不是视频文件请求
        let filename: string = context.request.url.split('uploadVideo/')[1]
        let rs = fssync.createReadStream(__dirname + '\\public\\uploadVideo\\' + filename)
        let stream = new Stream.PassThrough()
        rs.on('data', (chunk) => {
            stream.push(chunk, 'utf8')
            context.body = stream  //这是我自己尝试出来的,一开始我在end方法中输出的这个流,之后我尝试在这里输出了视频流,发现居然可以用,我想请教一下这种方式有没有问题?
        })
        rs.on('error', err => {
            console.log(err)
        })
    } else {
        await next()
    }
})

我想请教一下大佬们这种方式有没有问题?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文