无法读取大于2GB的视频文件

4
在一个ASP.NET应用中,我使用下面的代码从共享路径读取视频文件并在浏览器中播放。对于小于300 MB的文件,它可以工作正常,但是对于650 MB及以上的文件会抛出内存不足的异常,并且对于大于2 GB的文件会抛出如下限制错误:

文件过长。此操作目前仅支持小于2 GB的文件。

我的代码:
ImpersonationHelper.Impersonate(ConfigurationManager.AppSettings["Domain"], ConfigurationManager.AppSettings["UserName"],ConfigurationManager.AppSettings["Password"], delegate
{  
    FileBuffer = System.IO.File.ReadAllBytes(filepath);

    if (FileBuffer != null)
    {
        Response.Buffer = true;
        Response.ContentType = contenttype;
        Response.AddHeader("Content-Disposition", "inline");
        Response.AddHeader("content-length", FileBuffer.Length.ToString());

        Response.BinaryWrite(FileBuffer);
        Response.Flush();                       

        HttpContext.Current.ApplicationInstance.CompleteRequest();
        Response.Close();
        Response.End();                            
    } 
});
1个回答

2
将整个文件加载到内存中是一个不好的主意。不要使用FileBuffer数组,而可以采用以下方法: "避免将整个文件加载到内存中,可以使用以下方法:"
// ...
using (var stream = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
    Response.AddHeader("content-length", stream.Length.ToString());
    stream.CopyTo(Response.OutputStream);
}

你还应该删除这一行代码:Response.Buffer = true;,并在开头添加Response.BufferOutput = false;。当BufferOutput == true时,Web服务器会将整个输出保存到内存中,然后才将其发送给客户端。我们不希望发生这种情况。"最初的回答"

你好,感谢您的快速回复。请问您能否扩展代码?目前在浏览器中播放视频时,它显示一些随机数字和符号。我有什么遗漏吗?对于超过2GB的文件,它会抛出“内存不足以继续执行程序”的异常。对于小于2GB的文件没有异常。 - Srik A
你应该像代码中一样填充其他头文件。我只是展示了如何填充内容长度头文件并将文件复制到输出流。 - Zergatul
嗨Zergatul,谢谢你的回答。我能够渲染小于1GB的视频文件,但是视频播放一段时间后停止,抛出“没有足够的存储空间来处理此命令”的错误,你对此有什么想法吗?而且对于大于2GB的视频文件仍然会得到“内存不足以继续执行程序”的错误提示。 - Srik A
@SrikanthA 这是代码中的异常还是您使用的浏览器出错了? - Zergatul
你好Zergatul:有没有办法禁用下载选项?要求是防止用户下载。 - Srik A
@SrikanthA 如果用户足够聪明,他总是可以下载视频的。我不知道是否有一种简单的方法来防止非经验丰富的用户下载。你最好为此创建一个新主题,或尝试找到类似的问题。 - Zergatul

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