Источник видео Html5 из обработчика ashx

У меня есть видеоданные, хранящиеся в базе данных, и я хочу воспроизвести их на своей странице. Я делаю собственный обработчик (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>

Но ничего не играет. Кто-нибудь может объяснить мне причину?


person Gab    schedule 01.06.2013    source источник
comment
по какой причине вы не приняли ответ Аристоса?   -  person fubo    schedule 08.12.2014


Ответы (1)


Основная ошибка заключается в том, что вы не установили ContentType для видео и оставили браузер, чтобы решить, что это такое. Установите его как:

context.Response.ContentType = "video/mpeg";

Также "Content-Disposition" используется для загрузки файла, удалите и его

Клир здесь не имеет значения, уберите его

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();
}
person Aristos    schedule 01.06.2013