Загрузка файла JSF в GAE - PullRequest
1 голос
/ 15 марта 2012

Я пытаюсь добавить в JSF элемент загрузки файлов через Google App Engine. Я просмотрел в Интернете несколько вариантов, но, похоже, ни одна из них не работает с GAE.

Я смог сделать это с помощью JSP и сервлета с BlobstoreService, но не смог найти способ заставить его работать с JSF.

В качестве обходного пути я пытался выяснить, есть ли способ включить JSP в JSF, но я думаю, что это также не выполнимо.

Был бы благодарен за рабочий пример.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 11 июля 2012

Сначала получите библиотеку http://code.google.com/p/gmultipart/ и добавьте в свой проект.А затем переопределите класс org.primefaces.webapp.filter.FileUploadFilter (просто поместите в свой src).Существует код класса org.primefaces.webapp.filter.FileUploadFilter:

package org.primefaces.webapp.filter;

    import java.io.File;
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    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.FileItemFactory;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.gmr.web.multipart.GFileItemFactory;
    import org.primefaces.webapp.MultipartRequest;

    public class FileUploadFilter implements Filter {

        private final static Logger logger = Logger.getLogger(FileUploadFilter.class.getName());

        private final static String THRESHOLD_SIZE_PARAM = "thresholdSize";

        private final static String UPLOAD_DIRECTORY_PARAM = "uploadDirectory";

        private String thresholdSize;

        private String uploadDir;

        public void init(FilterConfig filterConfig) throws ServletException {
            thresholdSize = filterConfig.getInitParameter(THRESHOLD_SIZE_PARAM);
            uploadDir = filterConfig.getInitParameter(UPLOAD_DIRECTORY_PARAM);

            if(logger.isLoggable(Level.FINE))
                logger.fine("FileUploadFilter initiated successfully");
        }

        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            boolean isMultipart = ServletFileUpload.isMultipartContent(httpServletRequest);

            if(isMultipart) {
                if(logger.isLoggable(Level.FINE))
                    logger.fine("Parsing file upload request");

                //start change
                FileItemFactory diskFileItemFactory = new GFileItemFactory(); 
               /* if(thresholdSize != null) {
                    diskFileItemFactory.setSizeThreshold(Integer.valueOf(thresholdSize));
                }
                if(uploadDir != null) {
                    diskFileItemFactory.setRepository(new File(uploadDir));
                }*/
                //end change

                ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
                MultipartRequest multipartRequest = new MultipartRequest(httpServletRequest, servletFileUpload);

                if(logger.isLoggable(Level.FINE))
                    logger.fine("File upload request parsed succesfully, continuing with filter chain with a wrapped multipart request");

                filterChain.doFilter(multipartRequest, response);
            } else {
                filterChain.doFilter(request, response);
            }
        }

        public void destroy() {
            if(logger.isLoggable(Level.FINE))
                logger.fine("Destroying FileUploadFilter");
        }

    }

В методе записи управляемого бина, например:

 public void handleFileUpload(FileUploadEvent event) {
    UploadedFile uploadedFile = event.getFile();

    try {
        String blobKey = BlobUtils.uploadImageToBlobStore(uploadedFile.getContentType(), uploadedFile.getFileName(), uploadedFile.getContents());
        this.iconKey = blobKey;

    } catch (IOException e) {
        log.log(Level.SEVERE, "Ошибка при попытке загрузить файл в blob-хранилище", e);
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ошибка при попытке загрузить файл", event.getFile().getFileName() + " не загружен!");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return;
    }

    FacesMessage msg = new FacesMessage("Успешно.", event.getFile().getFileName() + " загружен.");
    FacesContext.getCurrentInstance().addMessage(null, msg);

}

И это все.

1 голос
/ 15 марта 2012

Прежде всего, я думаю, что все, что вы делаете с JSP, должно в конечном итоге работать и с JSF ..

НО

Если вы ищете компонент загрузки файлов для JSF, который работает в GAE,

взгляните на файл загрузки PrimeFaces

Вот еще одна ссылка, которая объясняет, что нужно сделать, чтобы он работал на GAE: Фильтр загрузки файлов Primefaces

(сам не пробовал ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...