gpt4 book ai didi

c# - 使用 C# 和流式传输文件上传

转载 作者:行者123 更新时间:2023-11-30 17:09:30 25 4
gpt4 key购买 nike

了解在 .NET 中上传文件的不同方式,例如HttpPostedFile,并使用 HttpHandler,我试图更详细地了解该过程的工作原理。

特别是它如何将信息写入文件。

假设我有以下内容:

HttpPostedFile file = context.Request.Files[0];
file.SaveAs("c:\temp\file.zip");

直到似乎处理了整个流,才创建实际文件。

类似地:

using (Stream output = File.OpenWrite("c:\temp\file.zip"))
using (Stream input = file.InputStream)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}

我原以为这会在读取流时“逐步”写入文件。查看文件系统,它似乎根本没有这样做。如果我在 while 内断点,它会执行。

我想做的是让你上传一个文件(使用 javascript uploader ),并同时进行轮询,轮询 ajax 请求每秒尝试获取上传文件的文件信息(文件大小) .但是,它始终返回 0,直到上传完成。

Vimeo 似乎能够执行此类功能(针对 IE)??这是 .NET 的限制,还是有办法从流中逐步写入文件?

最佳答案

两点:

首先,在 Windows 中,文件的显示大小不会不断更新。该文件可能确实在不断增长,但大小只会增加一次。

其次(在这种情况下更有可能),流可能没有刷新到磁盘。您可以通过在调用 output.Write() 之后添加 output.Flush() 来强制执行此操作。不过,您可能不想这样做,因为它可能会对性能产生负面影响。

也许您可以直接轮询输出流的 Length 属性,而不是通过文件系统。

编辑:

要使其他线程可以访问流的 Length 属性,您可以在您的类中有一个字段并在每次读/写时更新它:

private long _uploadedByteCount;

void SomeMethod()
{
using (Stream output = File.OpenWrite("c:\temp\file.zip"))
using (Stream input = file.InputStream)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
Interlocked.Add(ref _uploadedByteCount, bytesRead);
}
}
}

public long GetUploadedByteCount()
{
return _uploadedByteCount;
}

关于c# - 使用 C# 和流式传输文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12927932/

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