我应该处理FileUpload.PostedFile.InputStream吗?

时间:2016-05-10 13:27:28

标签: c# asp.net file-upload webforms dispose

是否需要此代码,或者因为页面的UnLoad事件处理了页面上的所有控件,所以编写此类代码没有意义:

fu.PostedFile.InputStream.Flush();
fu.PostedFile.InputStream.Close();
fu.FileContent.Dispose();    

我问,因为来自docs的例子,我看到他们写的代码像

FileUpload1.SaveAs(savePath);

但事后没有事情处理流,但在手上我看到有人在保存后明确处理输入流?

1 个答案:

答案 0 :(得分:4)

Official guidance表示不需要处理此流,因为它将在请求处理结束时处理:

  

请求结束时,将销毁分配用于缓冲上载文件的服务器资源。要保存文件的持久副本,请使用SaveAs方法。

为了支持这一点,我还做了一些挖掘源代码的代码。事实证明,FileUploadHttpPostedFile都不负责处理此流。事实上,他们自己根本不拥有任何资源,只是提供一个访问部分请求的界面。

HttpRequest做了一些处理。但并非所有一次性物品都被丢弃。这是Dispose

/*
 *  Cleanup code
 */
internal void Dispose() {
    if (_serverVariables != null)
        _serverVariables.Dispose();  // disconnect from request

    if (_rawContent != null)
        _rawContent.Dispose();  // remove temp file with uploaded content
}

但是没有处理的是上传控制界面的集合HttpRequest.Files。要使用数据填充此集合,每个发布的文件都会包装到HttpPostedFile对象中,并为每个对象创建HttpInputStream。此流对象保存对整个数据的引用(请参阅上面的rawContent)并了解相关文件部分的偏移量和长度。值得注意的是HttpInputStream实现了IDisposable,但是我无法找到处理这些流对象的代码。

总结一下:

  1. 上传控件不会丢弃流
  2. 请求或HttpContext不会处理流
  3. 但请求处理基础数据
  4. 所以看起来这里的想法是,当请求处理完成后,将丢弃对相关数据的引用并将其处理。因此,手动处理您使用过的流不会受到伤害,但也没有必要。