gpt4 book ai didi

asp.net - 在 ASP.NET 中流式传输文件的最佳方式

转载 作者:行者123 更新时间:2023-12-02 08:32:32 24 4
gpt4 key购买 nike

使用 ASP.NET 流式传输文件的最佳方式是什么?

似乎有多种方法可以实现此目的,我目前正在使用 Response.TransmitFile() http 处理程序中的方法,该方法将文件直接发送到浏览器。它用于多种用途,包括将 FLV 从 Webroot 外部发送到嵌入式 Flash 视频播放器。

但是,这似乎不是一个可靠的方法。特别是,Internet Explorer (7) 存在一个奇怪的问题,浏览器在观看一两个视频后就会挂起。单击任何链接等都没有任何效果,让网站再次正常运行的唯一方法是关闭浏览器并重新打开它。

这种情况也会出现在其他浏览器中,但频率要低得多。基于一些基本测试,我怀疑这与文件的流式传输方式有关......也许连接没有正确关闭,或者类似的东西。

尝试了一些不同的方法后,我发现以下方法对我有用:

Response.WriteFile(path);
Response.Flush();
Response.Close();
Response.End();

这解决了上述问题,并且观看视频不再导致 Internet Explorer 挂起。

但是,我的理解是Response.WriteFile()首先将文件加载到内存中,并且考虑到某些正在流式传输的文件可能非常大,这似乎不是一个理想的解决方案。

我有兴趣了解其他开发人员如何在 ASP.NET 中流式传输大型文件,特别是流式传输 FLV 视频文件。

最佳答案

我会把东西放在“aspx”管道之外。特别是,我会编写一个运行处理程序(ashx,或通过配置映射),它执行最小工作,并简单地以 block 的形式写入响应。处理程序将照常接受来自查询字符串/表单的输入,找到要流式传输的对象,并流式传输数据(在循环中使用中等大小的本地缓冲区)。一个简单(不完整)的示例如下所示:

public void ProcessRequest(HttpContext context) {
// read input etx
context.Response.Buffer = false;
context.Response.ContentType = "text/plain";
string path = @"c:\somefile.txt";
FileInfo file = new FileInfo(path);
int len = (int)file.Length, bytes;
context.Response.AppendHeader("content-length", len.ToString());
byte[] buffer = new byte[1024];
Stream outStream = context.Response.OutputStream;
using(Stream stream = File.OpenRead(path)) {
while (len > 0 && (bytes =
stream.Read(buffer, 0, buffer.Length)) > 0)
{
outStream.Write(buffer, 0, bytes);
len -= bytes;
}
}
}

关于asp.net - 在 ASP.NET 中流式传输文件的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/608480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com