Как использовать пользовательские struts.multipart.parser - PullRequest
2 голосов
/ 20 января 2012

Я хочу реализовать пользовательский Struts2 MultiPartRequest для реализации прогрессивной загрузки файлов, установив прослушиватель прогресса.

Я написал свой пользовательский FileUploadMultipartRequest , реализовав MultiPartRequest принадлежит Core-struts2.

public class FileUploadMultipartRequest implements MultiPartRequest {

    static final Log log = LogFactory.getLog(MultiPartRequest.class);

    // maps parameter name -> List of FileItem objects
    private Map<String, List<FileItem>> files = new HashMap<String, List<FileItem>>();
    // maps parameter name -> List of param values
    private Map<String, List<String>> params = new HashMap<String, List<String>>();
    // any errors while processing this request
    private List<String> errors = new ArrayList<String>();

    private long maxSize;

    @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
    public void setMaxSize(String maxSize) {

        this.maxSize = Long.parseLong(maxSize);
    }

    /**
     * Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's
     * multipart classes (see class description).
     *
     * @param saveDir        the directory to save off the file
     * @param servletRequest the request containing the multipart
     * @throws java.io.IOException  is thrown if encoding fails.
     */
    public void parse(HttpServletRequest servletRequest, String saveDir) throws IOException {

        DiskFileItemFactory fac = new DiskFileItemFactory();
        // Make sure that the data is written to file
        fac.setSizeThreshold(0);

        if (saveDir != null) {

            fac.setRepository(new File(saveDir));
        }

        ProgressMonitor monitor = null;

        // Parse the request
        try {

            ServletFileUpload upload = new ServletFileUpload(fac);

            upload.setSizeMax(maxSize);

            monitor = new ProgressMonitor();
            upload.setProgressListener(monitor);
            servletRequest.getSession().setAttribute(ProgressMonitor.SESSION_PROGRESS_MONITOR, monitor);
            ...
        }
    }
    ...
}

И я устанавливаю свойства в struts.xml

<constant name="struts.multipart.parser" value="com.cloudlabz.service.web.action.FileUploadMultipartRequest " />
<constant name="struts.multipart.maxSize" value="504857600" />

Хотя я установил свой пользовательский MultipartRequestHandeler в struts.xml, ноТем не менее Struts 2 выполняет свой собственный JakartaMultiPartRequest (синтаксический анализатор Struts2 по умолчанию для обработки многочастного запроса), а не мой пользовательский класс FileUploadMultipartRequest.

Пожалуйста, предложите мне какой-нибудь способ его решения.

Ответы [ 3 ]

4 голосов
/ 20 января 2012

Если вы используете Struts 2 версии 2.1.8 +, то в этом случае все, что вам нужно, чтобы исправить struts.multipart.parser в struts.multipart.handler что-то вроде

<constant name="struts.multipart.handler"
          value="com.cloudlabz.service.web.action.FileUploadMultipartRequest" /> 

в вашем случае jakarta сделаетчто будет делать struts-plugin.xml файл конфигурации с тем же определением bean-компонента.

Для более ранней версии существует один подход, создайте плагин, скажем MycustomFileUpload.Поместите в WEB-INF / lib, убедитесь, что файл JAR должен содержать классы и файл struts-plugin.xml.

добавить следующую запись в struts-plugin.xml

<struts>
       <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
             name="jakartax"
             class="com.cloudlabz.service.web.action.FileUploadMultipartRequest"
             scope="default" />
</struts>

В этом случае вам не нужно определять константу в вашем файле struts.xml. Надеюсь, это сработает для вас.

1 голос
/ 08 августа 2012

Я только что реализовал решение, подобное этому, с 2.3.4, чтобы иметь индикатор прогресса для загрузки. Самый простой способ - сделать копию JakartaMultiPartRequest и переименовать ее в MonitoredMultiPartRequest.

Затем измените функцию parseRequest на эту:

private List<FileItem> parseRequest(HttpServletRequest servletRequest,
                                    String saveDir) throws FileUploadException {

   DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);

   ServletFileUpload upload = new ServletFileUpload(fac);
   upload.setSizeMax(maxSize);

   ProgressMonitor monitor = new ProgressMonitor();
   upload.setProgressListener(monitor);
   servletRequest.getSession().setAttribute(ProgressMonitor.SESSION_PROGRESS_MONITOR, monitor);

   return upload.parseRequest(createRequestContext(servletRequest));
}

Это добавляет монитор выполнения к слушателю (я основал мой на этом , затем в вашем Struts.xml добавьте следующее

<!-- Custom multipart parser with monitoring for progress bar -->
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="monitored" class="com.stackoverflow.multipart.MonitoredMultiPartRequest" scope="default" />
<constant name="struts.multipart.handler" value="monitored" />

Как видите, я переопределяю стандартные значения, смотрите Struts-default.xml здесь https://cwiki.apache.org/WW/struts-defaultxml.html, где вы можете увидеть, как он настроен

<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="struts" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default"/>
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" />
<constant name="struts.multipart.handler" value="jakarta" />
0 голосов
/ 15 марта 2017

Это должно быть так:

<struts>
  <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest"
        name="jakartax"
        class="com.cloudlabz.service.web.action.FileUploadMultipartRequest"
        scope="prototype" />

  <constant name="struts.multipart.handler" value="jakartax" /> 
</struts>
...