Элемент struts2 s:form обрезает параметр s:url в атрибуте действия
Я использую <s:url>
создать URL как removeAction.action?id=10
который должен использоваться атрибутом действия в <s:form>
элемент.
Проблема здесь в том, когда <s:form>
превращается в <form>
элемент, который я могу видеть только значение атрибута действия как action="/project/removeAction.action"
, Параметр id обрезается. Результат, который я хотел action="/project/removeAction.action?id=10"
<s:url var="actionUrl" action="removeAction" includeContext="false">
<s:param name="id" value="%{id}" />
</s:url>
<s:form action="%{actionUrl}" method="post" enctype="multipart/form-data" >
<div>
<s:file name="imgUpload"/>
<s:submit> upload </submit>
</div>
</s:form>
Недавно я обновил базовую версию struts2 до 2.3.12 и получил эту проблему. Эта проблема начинается после версии 2.3.4.1
И я не хочу использовать hidden
атрибут для передачи параметра, так как этот параметр теряется при большом размере файла для загрузки.
Есть ли решение для этого?
3 ответа
Может быть, вы могли бы использовать сопоставление с подстановочными знаками
<action name="removeAction\\*" class="..">
</action>
И передайте идентификатор как часть URL-адреса. Self.eg: removeAction/101
См. http://struts.apache.org/release/2.3.x/docs/wildcard-mappings.html
Что это означает, что скрытый параметр будет потерян при загрузке файла с слишком большим файлом? Он будет перечитан и заполнен автоматически...
не звони
RemoveAction
действие, которое фактически загружает файл. Назови этоUploadAction
, ради логики:|не рекомендуется использовать параметры запроса в запросах POST, их следует использовать только в запросах GET, возможно, в режиме REST...
Чтобы предотвратить
max multipart size exceeded
ошибка, вставьте это вStruts.xml
:<constant name="struts.multipart.maxSize" value="52428800" />
Чтобы настроить максимальный размер (по умолчанию 2 МБ) для одного файла в
fileUpload Interceptor
вставь это вStruts.xml
, в вашемStack definition
:<interceptor-ref name="fileUpload"> <param name="maximumSize">10485760</param> </interceptor-ref>
(в этом примере вы можете загрузить до 5 файлов по 10 МБ каждый подряд)
Наконец, для всех
HTML5
совместимые браузеры (почти все, кроме более старых версий IE и некоторых мобильных устройств), вы можете предотвратить загрузку ПЕРЕД ПОСЛОМ, проверив его размер вonchange
событие как это:<s:file name="imgUpload"/ onchange="javascript:checkFileSize(this);" /> <script> const maxFileSize = 10485760; // 10MB function checkFileSize(fileElement){ if (fileElement.files[0].size > maxFileSize) { var mb = (((fileElement.files[0].size) / 1024)/1024).toFixed(2); alert("Max file size exceeded: " + mb + " MegaBytes"); fileElement.value = ''; } } </script>
Эта проблема возникает из-за того, что метод org.apache.struts2.components.ServletUrlRenderer.renderUrl() не находит конфигурацию действия для вашего действия "removeAction", поскольку ваш URL (#actionUrl) уже содержит суффикс ".action".
Из Struts2 s: форма документации по параметру действия:
Установите имя действия для отправки без суффикса.action
Решение довольно простое: не используйте <s:url>
скорее:
<s:form action="removeAction?id=%{id}" method="post" enctype="multipart/form-data">
<div>
<s:file name="imgUpload"/>
<s:submit> upload </s:submit>
</div>
</s:form>