h: commandButton löst keine Aktion aus, wenn das h: form enctype = "multipart / form-data" hat

JSF: 1.2

Server: Weblogic

Ich versuche, mehrere Dateien hochzuladen. Da ich IE7 unterstützen muss, kann ich keine HTML5-Eingabedatei verwenden. Daher habe ich geplant, eine Schaltfläche hinzuzufügen. Wenn Sie darauf klicken, wird der Seite eine Eingabedatei hinzugefügt.

In erster Linie habe ich meine Arbeit mit ADF Faces begonnen. Aber das hat nicht funktioniert. Das war ein unerwartetes Verhalten.

Ich habe auch Tomahawks Datei-Upload-Komponente ausprobiert, aber das Problem bestand darin, dass nach dem Hinzufügen eines neuen Datei-Uploads aus dem Backend die zuvor erstellten Datei-Upload-Felder leer wurden. nicht derUploadedFile Beispiel. Dies wird jedoch meine Anforderung nicht erfüllen. Wie muss ich den gesamten Pfad in den Datei-Uploadern anzeigen, bis die endgültige Schaltfläche Formular senden angeklickt wurde.

Dann nahm ich Hilfe von Apache Commons FileUpload.

Ich habe das mit reinem JSP und Apaches Fileupload ausprobiert und das hat gut funktioniert.

Aber ich möchte es mit JSF mit Apaches Fileupload implementieren, und als ich versuchte, dies zu tun, verursachte es Probleme.

Die JSPX-Seite ist unten angegeben:

<?xml version='1.0' encoding='utf-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html">
  <jsp:output omit-xml-declaration="true" doctype-root-element="HTML"
              doctype-system="http://www.w3.org/TR/html4/loose.dtd"
              doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/>
  <jsp:directive.page contentType="text/html;charset=utf-8"/>
  <f:view>
    <html>
      <head>
        <meta http-equiv="Content-Type"
              content="text/html; charset=utf-8"/>
        <title>home</title>
      </head>
      <body>
        <h:form enctype="multipart/form-data">
            <input type="file" name="file"/>
            <h:commandButton value="Upload" action="#{uploadBean.upload}" />
        </h:form>
      </body>
    </html>
  </f:view>
</jsp:root>

Ich habe einen Filter erstellt, da ich die richtige mehrteilige Anfrage von der nicht erhalten kannaction Veranstaltung.

Die web.xml ist:

<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>
  <filter>
    <filter-name>UploadFilter</filter-name>
    <filter-class>com.edfx.massupload.filter.UploadFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>UploadFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>/home.jspx</welcome-file>
  </welcome-file-list>
</web-app>

Der 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<FileItem> items = upload.parseRequest(httpRequest);
            System.out.println(items.size());
            List<FileItem> files = new ArrayList<FileItem>();            
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    files.add(item);
                }
            }

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

        chain.doFilter(request, response);
    }
}

Und zum Schluss die gemanagte Bohne:

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 "";
    }
}

Mein Ziel ist es, das Eingabedateifeld dynamisch durch JavaScript oder jQuery hinzuzufügen, was in JSP gut funktioniert, das möchte ich in JSF bekommen.

Wenn ich das entferneenctype="multipart/form-data" von demh:form dann wird die Aktionsmethode ausgeführt, sonst nicht.

Jeder Vorschlag wäre sehr hilfreich für mich.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage