Загрузка большого файла не работает с JSF + tomcat, несмотря на установку multipart-config на неограниченный размер

Загрузка файлов работает для небольших файлов (с ограничением по умолчанию 2 МБ), но не будет работать для больших файлов. Я использую JSF на Tomcat 8.0 и изменил свой web.xml соответствующим образом, чтобы увеличить лимит. Я установил точки останова в конструкторе javax.servlet.MultipartConfig, чтобы я мог видеть, что он читает конфигурацию web.xml. Однако когда вызывается действие, по умолчанию возвращается значение по умолчанию 2 МБ (в частности, в Request.parseParts (...) конфигурация оболочки равна нулю, поэтому используется значение по умолчанию для коннектора).

web.xml:

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<multipart-config>
  <max-file-size>-1</max-file-size>
  <max-request-size>-1</max-request-size>
  <file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>

home.xhtml

<h:form id="contentFormId" enctype="multipart/form-data">
...
  <h:inputFile style="display:none;" id="fileUpload" value="#{bean.uploadItem}">
  </h:inputFile>
  <h:commandButton id="browse" action="#{bean.fileUploadListener}" value="Add Files" onclick="$('#contentFormId-fileUpload').click()">
  </h:commandButton>
...
</h:form>

context.xml

<?xml version="1.0" encoding="utf-8"?>
<Context allowCasualMultipartParsing="true" 
...
</Context>

Обновлено После создания упрощенного приложения, похоже, что библиотека Rewrite вызывает использование другой оболочки контейнера в запросе.

Без переписать:Request.getWrapper() возвращается StandardEngine[Catalina].StandardHost[localhost].StandardContext[/TestWeb].StandardWrapper[Faces Servlet]

С переписать @URLMapping аннотация:Request.getWrapper() возвращается StandardEngine[Catalina].StandardHost[localhost].StandardContext[/TestWeb].StandardWrapper[default]

Таким образом, мне кажется, что мне нужно настроить контейнер по умолчанию для этого приложения, аналогично тому, как настроен Faces, или найти способ заставить Rewrite делегировать контейнер сервлета Faces. Редактирование maxPostSize в Tomcat - это вариант (изменить значение по умолчанию), но я не хочу использовать его, если смогу избежать этого.

1 ответ

Мне не нравится это решение, но пока оно служит моим целям. Похоже, что он должен по умолчанию настройки FacesServlet, потому что это конечный пункт назначения после перезаписи.

Моим решением было перенести (или скопировать) настройку multipart-config в сервлет по умолчанию в web.xml:

<servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>default</servlet-name>
  <multipart-config>
    <max-file-size>-1</max-file-size>
    <max-request-size>-1</max-request-size>
    <file-size-threshold>0</file-size-threshold>
  </multipart-config>
</servlet>
Другие вопросы по тегам