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

时间:2017-05-05 04:51:53

标签: java struts2 apache-commons-fileupload

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

2 个答案:

答案 0 :(得分:0)

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

然而,一个小小的警告:即使文件系统是内存支持的,它的一部分也可能被某些低级操作系统机制(例如,分页)写入磁盘。但是,对于存储在内存中的任何内容都是如此,而不仅仅是内存支持的文件系统。如果这个存储必须绝对保留在内存中,甚至永远不会被分页,那么你需要更有创意,并确保文件系统支持的内存始终是#34;常驻"。

答案 1 :(得分:0)

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

首先,我让业务部门同意上传文件的合理最大大小,并且一次只允许上传一个文件。如果没有这个协议,我在下面概述的解决方案将无效。

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

我还有其他一些清理项目,但整体而言,这种方法似乎运作良好。