gpt4 book ai didi

c# - FileResult 缓冲到内存

转载 作者:太空狗 更新时间:2023-10-29 22:53:02 26 4
gpt4 key购买 nike

我正在尝试通过 Controller ActionResult 返回大文件,并实现了如下所示的自定义 FileResult 类。

    public class StreamedFileResult : FileResult
{
private string _FilePath;

public StreamedFileResult(string filePath, string contentType)
: base(contentType)
{
_FilePath = filePath;
}

protected override void WriteFile(System.Web.HttpResponseBase response)
{
using (FileStream fs = new FileStream(_FilePath, FileMode.Open, FileAccess.Read))
{
int bufferLength = 65536;
byte[] buffer = new byte[bufferLength];
int bytesRead = 0;

while (true)
{
bytesRead = fs.Read(buffer, 0, bufferLength);

if (bytesRead == 0)
{
break;
}

response.OutputStream.Write(buffer, 0, bytesRead);
}
}
}
}

但是我遇到的问题是整个文件似乎都被缓冲到内存中。我需要做什么来防止这种情况发生?

最佳答案

您需要刷新响应以防止缓冲。但是,如果您在不设置内容长度的情况下继续缓冲,用户将看不到任何进展。因此,为了让用户看到正确的进度,IIS 缓冲整个内容,计算内容长度,应用压缩,然后发送响应。我们采用以下程序以高性能向客户交付文件。

FileInfo path = new FileInfo(filePath);

// user will not see a progress if content-length is not specified
response.AddHeader("Content-Length", path.Length.ToString());
response.Flush();// do not add anymore headers after this...


byte[] buffer = new byte[ 4 * 1024 ]; // 4kb is a good for network chunk

using(FileStream fs = path.OpenRead()){
int count = 0;
while( (count = fs.Read(buffer,0,buffer.Length)) >0 ){
if(!response.IsClientConnected)
{
// network connection broke for some reason..
break;
}
response.OutputStream.Write(buffer,0,count);
response.Flush(); // this will prevent buffering...
}
}

您可以更改缓冲区大小,但 4kb 是理想的,因为较低级别的文件系统也以 4kb 的 block 读取缓冲区。

关于c# - FileResult 缓冲到内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12464252/

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