h: commandButton не запускает действие, если h: form имеет enctype = «multipart / form-data»

JSF: 1.2

Сервер: Weblogic

Я пытаюсь осуществить загрузку нескольких файлов. Поскольку мне нужно оказать поддержку IE7, я не могу использовать входной файл HTML5. Итак, я планировал добавить кнопку, при нажатии на которую добавится входной файл на странице.

В первую очередь я начал свою работу с ADF Faces. Но это нет работал. Это ведет себя неожиданным образом.

Я также попробовал Томагавкs компонент для загрузки файлов, но проблема была в том, что после добавления нового файла для загрузки из бэкэнда ранее созданные поля для загрузки файлов стали пустыми; неUploadedFile пример. Но это не будет соответствовать моим требованиям. Поскольку мне нужно показать все пути в загрузчиках файлов, пока не будет нажата последняя кнопка отправки формы.

Тогда я воспользовался помощью Apache Commons FileUpload.

Я пробовал это с чистым JSP и Apache fileupload, и это работало хорошо.

Но я хочу реализовать это с JSF с помощью apache fileupload, и когда я попытался это сделать, это начало вызывать проблемы.

Страница JSPX приведена ниже:



  
  
  
    
      
        
        home
      
      
        
            
            
        
      
    
  

Я создал фильтр, так как не могу получить правильный многочастный запрос отaction событие.

Файл web.xml:



  
    javax.faces.STATE_SAVING_METHOD
    server
  
  
    UploadFilter
    com.edfx.massupload.filter.UploadFilter
  
  
    UploadFilter
    Faces Servlet
  
  
    Faces Servlet
    javax.faces.webapp.FacesServlet
    1
  
  
    Faces Servlet
    /faces/*
  
  
    /home.jspx
  

UploadFilter:

import java.io.IOException;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


public class UploadFilter implements Filter {
    private FilterConfig _filterConfig = null;

    public void init(FilterConfig filterConfig) throws ServletException {
        _filterConfig = filterConfig;
    }

    public void destroy() {
        _filterConfig = null;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Filter");
        if (!(request instanceof HttpServletRequest)) {
            chain.doFilter(request, response);
            return;
        }

        HttpServletRequest httpRequest = (HttpServletRequest)request;

        boolean isMultipartContent = ServletFileUpload.isMultipartContent(httpRequest);

        if (!isMultipartContent) {
            chain.doFilter(request, response);
            return;
        }

        long maxFileSize = (1024 * 1024 * 1024);
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8");
        upload.setSizeMax(maxFileSize);
        upload.setFileSizeMax(maxFileSize);

        try {
            List items = upload.parseRequest(httpRequest);
            System.out.println(items.size());
            List files = new ArrayList();            
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    files.add(item);
                }
            }

            httpRequest.setAttribute("files", files);
        } catch (FileUploadException ex) {
            ex.printStackTrace();
        }        

        chain.doFilter(request, response);
    }
}

И, наконец, управляемый компонент:

import javax.faces.context.FacesContext;

import javax.servlet.http.HttpServletRequest;

public class UploadBean {
    public UploadBean() {
        super();
    }

    public String upload() {
        System.out.println("====JYM");
        HttpServletRequest httpRequest = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        System.out.println(httpRequest.getAttribute("files"));
        return "";
    }
}

Моя цель - добавить поле входного файла динамически с помощью JavaScript или jQuery, что хорошо работает в JSP, я хочу получить это в JSF.

Если я удалюenctype="multipart/form-data" отh:form тогда выполняется метод действия, иначе нет.

Любое предложение будет очень полезно для меня.

Ответы на вопрос(2)

Ваш ответ на вопрос