我们有一个内容管理系统,允许我们的用户存储通过REST Web服务上传的文件。在将这些文件存储在存储库中之前,它们的内容是加密的。
检索这些文件时,文件内容将被解密,并放入字节数组中。目的是将这些内容作为文件附件传递回客户端,以便存储在本地计算机上。
为此,我正在将内容存储到临时文件中,并将临时文件作为附件传回。这种方法具有先前加密的存储库文件的令人讨厌的副作用,在临时目录中“以明文”存储。
我知道我可以在JVM结束时将临时文件设置为自动删除,但由于这是服务器,因此服务器重启之间可能需要很长时间。
我也可以(我猜)设置一些监听工作来定期检查临时目录并删除超过一定年龄的文件,但这看起来很麻烦,并没有真正解决问题 - 它只是缩短了曝光时间
我正在寻找避免临时文件的替代方案,但仍允许用户通过网络服务下载(最好是在内存中)文件作为附件。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
Stream
是一个选项吗?缺点是你将所有东西都存储在内存中。
答案 1 :(得分:2)
嗯,我想你可以将数据存储在Java对象中,例如HashMap并将其用作缓存(使用弱引用,以便在垃圾收集器决定执行此操作时缓存可以收集垃圾)。如果这意味着对使用中的堆数量产生可怕的后果,那么您可以查看运行内存缓存或Java等效内容,例如: ehcache将您的对象存储在远离JVM堆的位置。
有没有理由你不能只回流结果,所以当它完成时它会被JVM清理掉?
答案 2 :(得分:1)
你有什么理由要回传File对象,还是你可以改变的呢?
我问的原因是,你可以创建一个接口,它有一些方法,如getName()
,getContentStream()
等,然后将其传回而不是具体的File对象。
答案 3 :(得分:0)
您可以查看而不是文件的一件事是Memcached,并在解密后删除该文件。
此外,您可以将加密文件作为blob存储在数据库中,并将其作为流检索。然后你应该能够动态解密它。
答案 4 :(得分:0)
你能不能只保留对clear temp文件的引用并在加密完成后立即将其删除?或许可以描述更多围绕此过程的过程,就像创建文件一样?