查看在.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);
}
}
我原以为这会在读取流时“逐步”写入文件。看看文件系统,它似乎根本就没有这样做。如果我在一段时间内断点,它确实如此。
我正在尝试做的是让你上传一个文件(使用javascript上传器),并一起轮询,从而轮询ajax请求尝试每秒获取上传文件的fileinfo(filesize)。但是,在上传完成之前,它始终返回0.
Vimeo似乎能够做到这种类型的功能(对于IE)?这是.NET限制,还是有办法从流中逐步写入文件。
答案 0 :(得分:2)
两点:
首先,在Windows中,文件的显示大小不会不断更新。该文件可能确实在不断增长,但大小只会增加一次。
其次(在这种情况下更可能),流可能不会刷新到磁盘。您可以在调用output.Flush()
后添加output.Write()
来强制执行此操作。但是,您可能不想这样做,因为它可能会对性能产生负面影响。
也许您可以直接轮询输出流的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;
}