4

与在 MVC 中上传文件有些相关的问题。

上传文件时如何分配内存?

[HttpPost]
    public ActionResult FileUpload(string qqfile)
    {
            var stream = Request.InputStream;

假设一个人正在上传一个 100 MB 的文件,一旦Request.InputStream收到它会发生什么?

编辑:

流和Request.InputStream处理退出时会发生什么ActionResult

  • 流存储在哪里?内存分配?
  • 什么时候处理?Request.InputStream 什么时候处理?
  • 如果我将流存储在变量中,它保存到哪里?
  • 一旦动作结果退出,“流”变量会发生什么?
  • 变量“流”持有什么?,Request.InputStream的引用/指针?还是字节的“完整”副本(假设为 100MB)?
4

1 回答 1

5

Stream 旨在允许在尚未接收到所有数据时从数据源读取数据。情况就是如此Request.InputStream。其他的,比如MemoryStream,直接包装一个内存缓冲区。

数据的确切存储位置取决于流的类型。在 Socket 级别有一个缓冲区,数据可能会一直保存到它被读取,或者 IIS 可能会为您缓冲它。

当您(或 .NET,在这种情况下)处置 Stream 或垃圾收集器为您执行此操作时,缓冲区将被处置。套接字层当然只会在连接关闭后释放其缓冲区 - 释放流并不总是释放底层缓冲区。

流的设计使您可以只使用这些数据 - 一个Stream数据 - 而不必担心底层缓冲区。谁负责处理流的一般规则是:您创建它?你处理它。

响应您的编辑:如果您将流存储在变量中,例如在 ASP.NET 会话中,一旦Request不再需要该对象,.NET 无论如何都会处理该流。您的变量仍将包含对该流的引用,但从中读取将抛出一个ObjectDisposedException.

注意 aStream和缓冲区之间的区别 - aStream提供对任何类型缓冲区的读取和/或写入访问 - 甚至是“包含”尚未接收到的数据的虚拟缓冲区。尝试从该缓冲区读取将阻塞当前线程,直到(部分)数据已被接收(或直到发生错误)。

而且,为了完成混淆,您可以拥有从多个缓冲区读取的流、从同一缓冲区读取的多个流以及包装流的流。

于 2013-02-18T09:10:11.463 回答