您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

堆空间中的缓冲响应会导致大文件出现问题

堆空间中的缓冲响应会导致大文件出现问题

MyFaces ExtensionsFilter显然将_整个_响应缓冲在服务器的内存中,直到最后一位为止。因此,您基本上有2个选择:

摆脱MyFaces ExtensionsFilter

不要让请求点击MyFaces ExtensionsFilter

如果您实际上需要Web应用程序中的某些功能要求,那么选项1可能会非常激烈,但是如果可以找到替代方法,则可行。例如,如果您仅需要它来处理文件上传,则可以考虑为此使用替代组件库,甚至是标准JSF 2.2。

选项2可以通过两种方式实现:

例如,当仅应调用它时/upload.jsf,请替换<servlet-name><url-pattern>

    <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>/upload.jsf</url-pattern>
</filter-mapping>

仅当您实际上从同一页面执行下载操作时,这才很麻烦。

例如

    @WebServlet("/files/*")
public class FileServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String filename = request.getPathInfo().substring(1);

        // Just do your job to get the File or InputStream, depending on the functional requirements.
        // This kickoff example just allocates a file in the file system.
        File file = new File("/path/to/files", filename);
        response.setHeader("Content-Type", getServletContext().getMimetype(filename));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
        Files.copy(file.toPath(), response.getOutputStream());
    }

}

(注意:如果您仍未使用Servlet 3.0,请替换@WebServlet为;中的常规Servlet映射web.xml;如果您仍不在Java 7上,请替换Files#copy()为常规的InputStream/ OutputStream循环样板)

调用它的方式如下(假设您已链接到JSF1.2的Tomahawk的源代码;因此不支持模板文本中的EL,那么请假设在JSP上使用旧版JSF 1.2)。

    <h:outputLink value="#{request.contextPath}/files/#{bean.filename}">
    <h:outputText value="Download #{bean.filename}" />
</h:outputLink>

如果下载需要其他参数,请使用传递它们<f:param>

    <h:outputLink value="#{request.contextPath}/files/#{bean.filename}">
    <f:param name="foo" value="#{bean.foo}" />
    <f:param name="bar" value="#{bean.bar}" />
    <h:outputText value="Download #{bean.filename}" />
</h:outputLink>

然后可以在servlet中获得,如下所示:

    String foo = request.getParameter("foo");
String bar = request.getParameter("bar");
// ...
其他 2022/1/1 18:14:13 有485人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶