【发布时间】:2017-05-05 04:51:52
【问题描述】:
我需要将文件保存在内存中,直到它到达操作类,并且永远不要将文件写入磁盘。如果文件在磁盘上仅驻留几秒钟,则担心文件上传到的服务器上可能会发生一些漏洞利用。我觉得 Struts2 框架设置为仅用于将文件临时存储到磁盘的一种解决方案。这是一个正确的假设,还是我错过了一些非常简单的东西?
【问题讨论】:
标签: java struts2 apache-commons-fileupload
我需要将文件保存在内存中,直到它到达操作类,并且永远不要将文件写入磁盘。如果文件在磁盘上仅驻留几秒钟,则担心文件上传到的服务器上可能会发生一些漏洞利用。我觉得 Struts2 框架设置为仅用于将文件临时存储到磁盘的一种解决方案。这是一个正确的假设,还是我错过了一些非常简单的东西?
【问题讨论】:
标签: java struts2 apache-commons-fileupload
我能想到的一种方法是将struts.multipart.saveDir 设置为文件系统上的一个目录(例如/tmp 的子目录),并将该目录挂载为内存支持的存储。这将确保磁盘上不会驻留任何内容。
然而,一个小小的警告:即使文件系统是内存支持的,它的一部分也可能通过一些低级操作系统机制(例如分页)写入磁盘。但是,对于您存储在内存中的任何内容都是如此,而不仅仅是内存支持的文件系统。如果此存储必须绝对保留在内存中,甚至从不分页,则您需要更有创意并确保文件系统支持的内存始终是“常驻”的。
【讨论】:
如果有兴趣,所以我可以结束这个问题,我想分享一下我是如何实现不将上传的文件临时保存到磁盘的要求的。
首先,我让企业同意上传文件的合理最大大小,并且一次只允许上传一个文件。如果没有此协议,我下面概述的解决方案将不起作用。
我使用了 struts 的一个插件功能。我基于 JakartaMultiPartRequest 类创建了自己的 MutiPartRequest 插件和类。我注释掉了对文件系统的所有写入。设置最大文件大小为 10MB。将解析器中的 sizeThreshold 设置为略大于 10MB。通过将 sizeThreshold 设置为大于 maxSize,它在内存中创建了一项来保存上传文件的整个字节数组。然后我在 http 请求中创建了一个自定义属性来保存我的内存字节数组,以便我可以在操作类中访问它。我找不到其他方法来获取字节数组。
我还需要做一些其他的清理工作,但总体而言,这种方法似乎运作良好。
【讨论】: