3

我们有一个内容管理系统,允许我们的用户存储通过 REST Web 服务上传的文件。在将这些文件存储在存储库中之前,它们的内容会被加密。

检索这些文件时,文件内容被解密,并放入一个字节数组中。目的是将这些内容作为可以存储在本地计算机上的文件附件传递回客户端。

为此,我目前将内容存储到临时文件中,并将临时文件作为附件传回。这种方法具有先前加密的存储库文件的令人讨厌的副作用,被“明文”存储在临时目录中。

我知道我可以将临时文件设置为在 JVM 结束时自动删除,但由于这是一个服务器,服务器重启之间可能需要很长时间。

我也可以(我猜)设置某种侦听器作业来定期检查临时目录并删除超过一定年龄的文件,但这似乎很麻烦并且并不能真正解决问题 - 它只是缩短了曝光时间。

我正在寻找避免临时文件的替代方法,但仍允许用户通过 Web 服务将(最好在内存中)文件作为附件下载。

任何的想法?

谢谢!

4

5 回答 5

2

Stream一个选项吗?缺点是您将所有内容都存储在内存中。

于 2011-06-16T15:20:43.850 回答
2

好吧,我想您可以将数据存储在Java 对象中,例如HashMap 并将其用作缓存(使用弱引用,以便在垃圾收集器决定这样做时缓存可以收集垃圾)。如果这对使用中的堆数量意味着可怕的后果,那么您可以考虑运行 memcache 或 Java 等价物,例如 ehcache,以将您的对象存储在 JVM 堆之外。

您是否有理由不能将结果流回,以便在完成后被 JVM 清理?

于 2011-06-16T15:24:22.733 回答
1

是否有任何理由必须将 File 对象传回,或者这是否可以更改?

我问的原因是,您可以创建一个具有一些方法的接口,例如getName()getContentStream()等,然后将其传回而不是具体的 File 对象。

于 2011-06-16T15:22:29.473 回答
0

您可以查看而不是文件的一件事是Memcached,并在完成解密后删除文件。

此外,您可以将加密文件作为 blob 存储在数据库中,然后将其作为流检索。然后你应该能够即时解密它。

于 2011-06-16T15:27:50.750 回答
0

您能否仅保留对清除临时文件的引用并在加密完成后立即将其删除?也许将您的更多过程描述为文件创建的内容?

于 2011-06-16T15:29:05.523 回答