【问题标题】:JSF file upload on GAE在 GAE 上上传 JSF 文件
【发布时间】:2012-03-15 19:17:25
【问题描述】:

我正在尝试通过 Google App Engine 在我的 JSF 中添加文件上传元素。 我在网上浏览了几种替代方案,但似乎没有一个适用于 GAE。

我能够通过 BlobstoreService 使用 JSP 和 servlet 来做到这一点,但找不到使其与 JSF 一起工作的方法。

作为一种解决方法,我试图查看是否有办法在 JSF 中包含 JSP,但我想这也不可行。

如果能得到一个工作示例,将不胜感激。

谢谢!

【问题讨论】:

    标签: google-app-engine jsf file-upload


    【解决方案1】:

    首先获取库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");
            }
    
        }
    

    在托管 bean 写入方法中,如:

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

    仅此而已。

    【讨论】:

      【解决方案2】:

      首先,我认为无论您使用 JSP 做什么,最终都应该使用 JSF..

      但是,

      如果您正在寻找适用于 GAE 的 JSF 文件上传组件,

      看看PrimeFaces FileUpload

      这是另一个链接,其中解释了如何在 GAE 上运行:Primefaces File Upload Filter

      (自己没试过……)

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2015-03-14
        • 2013-02-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 2011-07-22
        • 2013-09-12
        • 2012-04-04
        相关资源
        最近更新 更多