有些问题与在MVC中上传文件有关。
上传文件时如何分配内存?
[HttpPost]
public ActionResult FileUpload(string qqfile)
{
var stream = Request.InputStream;
假设有人正在上传一个100 MB的文件,一旦Request.InputStream
收到它会发生什么?
编辑:
当处理退出Request.InputStream
时,流和ActionResult
会发生什么?
答案 0 :(得分:5)
Stream旨在允许从数据源读取,而尚未收到所有数据。 Request.InputStream
就属于这种情况。其他人,如MemoryStream
,直接包装内存缓冲区。
确切存储数据的位置取决于流的类型。 Socket级别上有一个缓冲区,可以保留数据直到读取,或者IIS可以为您缓冲数据。
当您(或.NET,在本例中)处理Stream或垃圾收集器为您执行此操作时,缓冲区将被丢弃。套接字层当然只有在连接关闭后才释放缓冲区 - 配置流并不总是处理底层缓冲区。
这些流的设计使您可以使用Stream
数据 - 而不必担心底层缓冲区。谁负责处理流的一般规则是:你创建它?你处理它。
响应您的编辑:如果您将流存储在变量中,例如在ASP.NET会话中,那么一旦不再需要Request
对象,.NET将会处理该流。您的变量仍将包含对该流的引用,但从中读取将引发ObjectDisposedException
。
注意Stream
和缓冲区之间的区别 - Stream
提供对任何类型缓冲区的读取和/或写入访问权限 - 即使是包含“未包含”数据的虚拟缓冲区还没收到。尝试从该缓冲区读取将阻止当前线程,直到(某些)数据被接收(或直到发生错误)。
并且,为了完成混淆,您可以拥有一个从多个缓冲区读取的流,从同一缓冲区读取多个流,以及流包装流。