FileUpload, Struts2, нет файла в FileUploaderInterceptor - PullRequest
0 голосов
/ 11 апреля 2019

Работающая среда портлетов Struts2, в которой я не могу заставить Struts fileUpload работать в режиме портлета.

Я вижу, что

  • Файл загружается на сервер, созданный ввременное пространство.
  • В исходном запросе присутствует многокомпонентный запрос с именем файла и содержимым файла, в который он входит в классы Struts.
  • Я могу вызвать ответ максимального размера, значение по умолчанию, установленное в Struts.
  • FileUploadInterceptor запущен, но в Jakarta MultipartRequest нет файла.Где-то между исходным запросом и оболочкой из Джакарты файл утерян.

Я пробовал такой же подход в урезанном приложении Spring boot 2, такая же проблема возникает, как и в основном проекте.За кодом следовали

https://struts.apache.org/core-developers/file-upload.html

для JSP и классов действий.Портлет создан, поток работает, но в действии нет файла.

Стандартный Sping Boot 2 с дополнительными в пом:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.5.20</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

Struts.xml

<package name="uploadtest" extends="struts-portlet-default" namespace="/uploadtest">

    <action name="uploadtestPrepare" class="bouvet.no.fileuploadtest.action.FileUploadSubmitAction">
        <result name="success">/WEB-INF/struts2/test/fileUpload.jsp</result>
    </action>
    <action name="uploadTestSubmit" class="bouvet.no.fileuploadtest.action.FileUploadSubmitAction">
        <result name="success">/WEB-INF/struts2/test/fileUpload.jsp</result>
    </action>
</package>

и формой

<s:form action="uploadTestSubmit" method="post" enctype="multipart/form-data">
    FileName: <s:property value="%{filename}"/>
    <s:file name="upload" label="File" />
    <s:submit/>
</s:form>

сеттер

public void setUploadFileName(String filename) {
        this.filename = filename;
    }

Это ошибка в режиме портлета или мне не хватает ключевой зависимости, компонента, версии?Альтернативный метод?

В образе, точке останова в диспетчере JSR168, файл присутствует.Первый код для запуска после сервера. точка останова в диспетчере JSR168

1 Ответ

0 голосов
/ 19 апреля 2019

Решением в этом случае было сделать шаг назад и посмотреть, что было в запросе.CMS, в которой работает портлет, фактически выполняет загрузку до того, как загрузка достигнет среды портлета.Обнаруженная мной оболочка из Джакарты была создана CMS, но находится за пределами области действия портлета.

Решение:

   public String intercept(ActionInvocation invocation) throws Exception {
        final ActionContext context = invocation.getInvocationContext();

        Object action = invocation.getAction();
        try {
            if (action instanceof FileUploadAware) {
                HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
//                if (request instanceof MultipartRequestWrapper) {
                    File file = (File) request.getAttribute("upload");
                    ((FileUploadAware) action).setFile(file);

//                }
            }
        }catch (Exception e){
            LOG.error("Exception? {}", e);
        }finally {
            return invocation.invoke();
        }

Не окончательное решение, а концепция, перехватчик, который находит атрибут загрузки в запросе и помещает его в действие FileUploadAware.Атрибут является локальным временным файлом, который CMS перехватил и создал.Это работает для меня, специальное решение для этой CMS или общее для портлетов?Не знаю.

...