【问题标题】:Where is data stored during streaming file upload via Apache Commons?通过 Apache Commons 上传流文件时,数据存储在哪里?
【发布时间】:2012-07-10 13:05:07
【问题描述】:

我看到了 this 关于如何通过 Apache Commons 进行流式文件上传的漂亮指南。这让我想到数据存储在哪里?是否有必要“关闭”或“清理”该位置?

谢谢!

【问题讨论】:

    标签: java jsp servlets apache-commons


    【解决方案1】:

    数据存储在哪里?

    我认为它没有被存储。 Streaming API 不使用 DiskFileItemFactory。但它确实使用了一个缓冲区来复制 BalusC 发布的数据。 一旦你有了上传的流,你就可以使用

    long bytesCopied = Streams.copy(yourInputStream, yourOutputStream, true);  
    

    API

    【讨论】:

      【解决方案2】:

      这是DiskFileItemFactory 的javadoc。

      默认的 FileItemFactory 实现。这个实现 创建 FileItem 实例,将其内容保存在内存中, 对于较小的项目,或在磁盘上的临时文件中,对于较大的项目。 将内容存储在磁盘上的大小阈值是 可配置的,临时文件所在的目录也是如此 已创建。

      如果没有另外配置,默认配置值为 如下:

      Size threshold is 10KB.
      Repository is the system default temp directory, as returned by System.getProperty("java.io.tmpdir").
      

      应删除为文件项创建的临时文件 稍后的。最好的方法是使用 FileCleaningTracker, 您可以在 DiskFileItemFactory 上进行设置。但是,如果您确实使用 这样的跟踪器,那么您必须考虑以下几点: 临时文件 不再需要时会自动删除。 (更多的 确切地说,当 File 的相应实例是垃圾时 收集。)这是由所谓的收割线程完成的,它是 加载 FileCleaner 类时自动启动。它可能 终止该线程是有意义的,例如,如果您的网络 申请结束。请参阅用户中的“资源清理”部分 commons-fileupload 指南。

      所以,是的,closecleanup 是必需的,因为 FileItem 可能表示磁盘上的真实文件。

      【讨论】:

      • 如果我错了,请纠正我,但流 api 不使用任何 DiskFileItemFactory 对象。还是暗示使用它?
      • @user571099。如果您点击问题中的链接并单击该页面顶部的User Guide,您将看到如何使用 DiskFileItemFactory。
      • @Alexander Pogrebnyak,我认为user571099是对的。用户指南是指传统的文件上传方法(普通文件上传的非流方式),它需要临时文件夹来存放文件阈值大小。文件需要删除,那么 reaper 线程就是为了这个目的。而在流 api 中,我们不使用 Stream API 中的 DiskFileItem,您可以查看示例用法,其中不使用 DiskFileItemFactory。要回答原始问题,数据以 byte[] 的形式存储在内存中,是的,您需要关闭 InputStream。接受的答案是正确的。
      【解决方案3】:

      它在 Java 内存中存储为 byte[]

      【讨论】:

        猜你喜欢
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        相关资源
        最近更新 更多