Элемент 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>
Другие вопросы по тегам