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
тогда выполняется метод действия, иначе нет.
Любое предложение будет очень полезно для меня.