File upload Primefaces多文件上传不';不显示文件也不触发handleFileUpload

File upload Primefaces多文件上传不';不显示文件也不触发handleFileUpload,file-upload,primefaces,uirepeat,File Upload,Primefaces,Uirepeat,我从一个星期开始搜索,但找不到解决问题的合适方法。所以我在问这里的专家 我正在尝试实现一个带有FileUpload的页面,以便在同一页面上上传并显示上传后的图像 我的问题是,如果我将ManagedBean设置为@RequestScope,则不会触发handleFileUpload功能。 如果我将其设置为@ViewScope,则会触发该功能,但会显示错误“流动态资源出错” 这是我的档案: web.xml <filter> <filter-name>PrimeFaces Fi

我从一个星期开始搜索,但找不到解决问题的合适方法。所以我在问这里的专家

我正在尝试实现一个带有FileUpload的页面,以便在同一页面上上传并显示上传后的图像

我的问题是,如果我将ManagedBean设置为
@RequestScope
,则不会触发
handleFileUpload
功能。 如果我将其设置为
@ViewScope
,则会触发该功能,但会显示错误“流动态资源出错”

这是我的档案:

  • web.xml

    <filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    <init-param>
        <param-name>thresholdSize</param-name>
        <param-value>2097152</param-value>
    </init-param>
    <init-param>
        <param-name>uploadDirectory</param-name>
        <param-value>E:/uploadedImages</param-value>
    </init-param>
    
    
    PrimeFaces文件上载筛选器
    org.primefaces.webapp.filter.FileUploadFilter
    阈值大小
    2097152
    上传目录
    E:/uploadedImages
    
    PrimeFaces文件上载筛选器 Facesservlet

  • 豆子

    @ManagedBean
    @RequestScoped
    public class ImageManager implements Serializable {
    
    private final static int MAX_UPLOADED_FILES = 5;
    private final static String UPLOADED_FILES_PATH = "E:/uploadedImages";
    
    private final Map<UUID, UploadedFile> uploadedFiles = new HashMap<>();
    
    public List<String> getListImages() {
        final List<String> result = new ArrayList<>();
    
        for (final UUID uuid : uploadedFiles.keySet())
            result.add(uuid.toString());
    
        return result;
    }
    
    public StreamedContent getImage() {
        final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        final String imageId = (String) externalContext.getRequestMap().get("imageId");
    
        if (imageId != null) {
            final UUID imageIndex = UUID.fromString(imageId);
            return new DefaultStreamedContent(new ByteArrayInputStream(uploadedFiles.get(imageIndex).getContents()), "image/jpg");
        }
    
        return null;
    }
    
    public void handleFileUpload(FileUploadEvent event) {
        if (uploadedFiles.size() < MAX_UPLOADED_FILES) {
            final UploadedFile uploadedFile = event.getFile();
            if (uploadedFile != null) {
                uploadedFiles.put(UUID.randomUUID(), uploadedFile);
            }
        }
    }
    
    }
    
    @ManagedBean
    @请求范围
    公共类ImageManager实现可序列化{
    私有最终静态int MAX_上传文件=5;
    私有最终静态字符串上载的\u文件\u PATH=“E:/uploadedImages”;
    private final Map uploadedFiles=new HashMap();
    公共列表getListImages(){
    最终列表结果=新建ArrayList();
    对于(最终UUID UUID:uploadedFiles.keySet())
    add(uuid.toString());
    返回结果;
    }
    公共流内容getImage(){
    final ExternalContext ExternalContext=FacesContext.getCurrentInstance().getExternalContext();
    最终字符串imageId=(字符串)externalContext.getRequestMap().get(“imageId”);
    if(imageId!=null){
    最终UUID imageIndex=UUID.fromString(imageId);
    返回新的DefaultStreamContent(新的ByteArrayInputStream(uploadedFiles.get(imageIndex.getContents()),“image/jpg”);
    }
    返回null;
    }
    公共无效handleFileUpload(FileUploadEvent事件){
    if(uploadedFiles.size()
  • xhtml

                  <p:fileUpload fileUploadListener="#{imageManager.handleFileUpload}"  
                            mode="advanced"
                            multiple="true"  
                            sizeLimit="2097152"
                            allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
                            uploadLabel="Hochladen"
                            auto="false"
                            cancelLabel="Abbrechen"
                            invalidFileMessage="Die ausgewählte Datei ist kein zugelassene Bilddatei"
                            invalidSizeMessage="Die maximale Bildgröße ist 2MB"
                            label="Datei Auswählen"
                            update="imageList"
                            />
    
    
    
        <ui:repeat value="#{imageManager.listImages}" var="imageId" id="imageList">
            <h:outputText value="#{imageId}" />
            <p:graphicImage value="#{imageManager.image}">
                <f:param id="imageId" name="imageId" value="#{imageId}" />
            </p:graphicImage>
        </ui:repeat>  
    
    
    

  • @丹尼尔,祝我好运。在我把问题发布到这里之前,我已经搜索了很多天了。但是我自己解决了这个问题

    如果有人有相同的问题,以下是解决方案:

        @Controller
        @Scope(WebApplicationContext.SCOPE_REQUEST)
        public class ImageManager implements Serializable {
    
            private final static int MAX_UPLOADED_FILES = 5;
            private final static String UPLOADED_FILES_PATH = "E:/uploadedImages";
    
            private final static Map<UUID, UploadedFile> uploadedFiles = new HashMap<>();
    
            private final static List<String> listImages = new ArrayList<>();
            private StreamedContent image;
    
            private static StreamedContent defaultImage = null;
            static {
                try {
                    defaultImage = new DefaultStreamedContent(new FileInputStream(new File("E:\\uploadedImages\\t.jpg")), "image/jpg");
                }
                catch (FileNotFoundException e) {
                    e.printStackTrace();
                }        
            }
    
            public List<String> getListImages() {
                return listImages;
            }
    
            public StreamedContent getImage() {
                final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
                final String imageId = (String) externalContext.getRequestParameterMap().get("imageId");
    
                if (imageId != null) {
                    final UUID imageIndex = UUID.fromString(imageId);
                    image = new DefaultStreamedContent(new ByteArrayInputStream(uploadedFiles.get(imageIndex).getContents()), "image/jpg");
    
                    return image;
                }
    
                return defaultImage;
            }
    
            public void handleFileUpload(FileUploadEvent event) {
                if (uploadedFiles.size() < MAX_UPLOADED_FILES) {
                    final UploadedFile uploadedFile = event.getFile();
                    if (uploadedFile != null) {
                        final UUID uuid = UUID.randomUUID();
                        uploadedFiles.put(uuid, uploadedFile);
                        listImages.add(uuid.toString());
                    }
                }
            }
    
            public void setImage(StreamedContent image) {
                this.image = image;
            }
    
        }
    
    @控制器
    @作用域(WebApplicationContext.Scope\u请求)
    公共类ImageManager实现可序列化{
    私有最终静态int MAX_上传文件=5;
    私有最终静态字符串上载的\u文件\u PATH=“E:/uploadedImages”;
    private final static Map uploadedFiles=new HashMap();
    私有最终静态列表listImages=new ArrayList();
    私有流内容图像;
    私有静态流内容defaultImage=null;
    静止的{
    试一试{
    defaultImage=新的DefaultStreamContent(新文件InputStream(新文件(“E:\\UploadeImage\\t.jpg”),“image/jpg”);
    }
    catch(filenotfounde异常){
    e、 printStackTrace();
    }        
    }
    公共列表getListImages(){
    返回列表图像;
    }
    公共流内容getImage(){
    final ExternalContext ExternalContext=FacesContext.getCurrentInstance().getExternalContext();
    最终字符串imageId=(字符串)externalContext.getRequestParameterMap().get(“imageId”);
    if(imageId!=null){
    最终UUID imageIndex=UUID.fromString(imageId);
    image=newdefaultstreamdcontent(newbytearrayinputstream(uploadedFiles.get(imageIndex.getContents()),“image/jpg”);
    返回图像;
    }
    返回默认图像;
    }
    公共无效handleFileUpload(FileUploadEvent事件){
    if(uploadedFiles.size()
    我认为这是p:graphicImage的原因,更确切地说,是因为它的内部用户界面:重复一点google,看看这里和这里