【问题标题】:Should I dispose FileUpload.PostedFile.InputStream?我应该处理 FileUpload.PostedFile.InputStream 吗?
【发布时间】:2016-09-05 12:26:22
【问题描述】:

是否需要这段代码,或者因为页面的 UnLoad 事件无论如何都会处理页面上的所有控件,所以编写这样的代码没有意义:

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

我之所以问,是因为在 msdn 的示例中,我看到他们编写的代码类似于

FileUpload1.SaveAs(savePath);

但以后不必费心处理流,但我看到有些人确实在保存后明确处理输入流?

【问题讨论】:

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


    【解决方案1】:

    Official guidance建议不需要dispose这个stream,因为它会在请求处理结束时被dispose:

    请求结束时,分配用于缓冲上传文件的服务器资源将被销毁。要保存文件的持久副本,请使用 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. Request 或 HttpContext 也不释放流
    3. 但 Request 处理基础数据

    所以看起来这里的想法是,当请求处理完成时,对相关数据的引用将被丢弃并被释放。所以手动处理你用过的流不会有什么坏处,但也不是必须的。

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2011-02-19
      • 2010-09-30
      • 2019-01-15
      • 2017-04-16
      • 2013-01-23
      相关资源
      最近更新 更多