HTML5视频源自ashx处理程序

3
我将我的视频数据存储在数据库中,想在网页中播放。我创建了自定义处理程序(FileHandler.ashx),如下所示。
 public void ProcessRequest(HttpContext context)
        {
            int id;
            if (context.Request.QueryString["FileId"] == null || !Int32.TryParse(context.Request.QueryString["FileId"], out id))
                return;
            var file = lnxFile.Get(id);
            string fileName = file.Name + file.Extension;
            context.Response.Clear();
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
            context.Response.BinaryWrite(file.Data);
            context.Response.End();
            context.Response.Flush();
        }

然后像这样使用html5的视频标签

<video id="jwplayer_placeholder" width="320" height="240" controls> 
    <source src="<%= "/CMS/Common/FileHandler.ashx?FileId=" + id %>" type="video/mp4">  
</video>

但是它没有播放任何东西。有人可以解释一下原因吗?

你为什么没有接受 Aristos 的答案? - fubo
1个回答

3
主要错误在于您没有设置视频的ContentType(互联网媒体类型-视频),而是让浏览器决定它是什么。请将其设置为:
context.Response.ContentType = "video/mpeg";

同时,"Content-Disposition"也用于下载文件,请将其删除。

这里的"clear"无意义,请将其删除。

context.Response.Clear();

同时设置Buffer=off,因为您需要直接将其发送到浏览器。

这个序列没有意义,只保留Flush。

   context.Response.End();
    context.Response.Flush();

所以最终的代码将会是这样:

 public void ProcessRequest(HttpContext context)
{
    int id;
    if (context.Request.QueryString["FileId"] == null || !Int32.TryParse(context.Request.QueryString["FileId"], out id))
        return;
    var file = lnxFile.Get(id);

    context.Response.Buffer = false;
    context.Response.ContentType = "video/mpeg";    
    context.Response.BinaryWrite(file.Data);    
    context.Response.Flush();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接