情况就是这样:
我们有一些存储在与我们的应用程序不同的服务器中的二进制文件(PDF,PPT,ZIPz等)。我们需要在我们的应用中为用户提供这些内容。但是文件具有极其敏感的信息,除了可以访问它们的用户之外,其他任何人都无法读取这些信息,这意味着我们需要在下载文件之前验证试图访问该文件的用户。
这就是我们解决问题的方法:
我关心这个解决方案的3个方面;文件大小会显着影响堆大小,文件大小限制为最大字节[Integer.MAXSIZE],最后每次有人下载文件时都会得到java.lang.IllegalStateException,因为我们正在调用response.getOutputStream( ),所以我们的日志正在增长很多。(我们无法通过servlet刷新它,因为我们使用的是我们无法修改或扩展的专有MVC)
我很确定有更优雅的方法来做到这一点。
有什么想法吗?
答案 0 :(得分:2)
确实只是不要在本地存储它。你从其他地方得到它InputStream
,对吧?只需将立即写入响应的OutputStream
即可。然后就不需要在Java的内存和本地磁盘文件系统中获取它。这意味着您应该将用于获取文件的逻辑放在JSP文件中。糟糕,糟糕,但因为这显然是一个专有框架......
然后是IllegalStateException
部分,您只需要确保 scriptlet 之外没有空白,包括换行符。它将全部隐含地通过response.getWriter()
编写,但这是不可能的,因为您已经为该文件调用了response.getOutputStream()
。删除JSP中<% %>
之外的所有内容。必要时将多个scriptlet粘贴在一起。不要忘记删除文件底部的最后一个换行符。
E.g。不是这样:
<%@ page import="java.io.*" %>
<% ... %>
<% ... %>
<% ... %>
但更重要的是:
<%@ page import="java.io.*" %><%
...
...
... %>
祝你好运这个webapp。
答案 1 :(得分:0)
跳过步骤2并直接将文件读入响应的输出流 为每个文件指定名称的UUID,因此您不会与文件名冲突。有一个守护进程去清理任何超过15分钟的文件。
答案 2 :(得分:0)
最优雅的解决方案可能是使用现有的开源软件产品。我相信知识树会满足您的要求。