是否可以使用 Struts 2 文件上传来不创建临时文件?

Is it possible using Struts 2 file upload to not create temp file?

我需要将文件保存在内存中,直到它触发操作 class,并且永远不要将文件写入磁盘。如果文件只在磁盘上停留几秒钟,就会担心文件上传到的服务器上可能会发生一些漏洞利用。我觉得 Struts2 框架设置为仅用于将文件临时存储到磁盘的一种解决方案。这是一个正确的假设,还是我错过了一些非常简单的东西?

我能想到的一种方法是将 struts.multipart.saveDir 设置为文件系统上的一个目录(例如 /tmp 的子目录)并将该目录安装为内存支持的存储。这将确保没有任何内容会驻留在磁盘上。

然而,一个小的、微小的警告:即使文件系统是内存支持的,它的一部分也可以通过一些低级 OS 机制(例如分页)写入磁盘。但是,对于存储在内存中的任何内容都是如此,而不仅仅是内存支持的文件系统。如果此存储必须绝对保留在内存中并且永远不会分页,则您需要更有创意并确保文件系统支持的内存始终为 "resident".

万一有人感兴趣,所以我可以结束这个问题,我想分享一下我是如何完成不将上传的文件临时保存到磁盘的要求的。

首先,我让商家同意上传文件的合理最大大小,并且一次只允许上传一个文件。如果没有这个协议,我下面概述的解决方案将不起作用。

我利用了 struts 的插件功能。我基于 JarkartaMultiPartRequest class 创建了自己的 MutiPartRequest 插件和 class。我注释掉了所有对文件系统的写入。将最大文件大小设置为 10MB。将解析器中的 sizeThreshold 设置为略大于 10MB。通过将 sizeThreshold 设置为大于 maxSize,它在内存中创建了一个项目来保存上传文件的整个字节数组。然后我在 http 请求中创建了一个自定义属性来保存我的内存字节数组,这样我就可以在操作 class 中访问它。我没有其他方法可以找到字节数组。

我还需要做一些其他的清理工作,但总的来说,这种方法似乎很有效。