1

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

我正在尝试使用 FileUpload 实现一个页面来上传并在同一页面上上传后显示图像。

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

这是我的文件:

  1. 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 FileUpload Filter Faces Servlet

  2. @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);
            }
        }
    }
    
    }
    
  3. 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>  
    
4

1 回答 1

0

@Daniel,相信我。在我在这里发布我的问题之前,我已经搜索了很多天。但我已经自己解决了这个问题。

如果有人遇到同样的问题,这里是解决方案:

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

    }
于 2012-05-10T21:18:22.170 回答