1週間前から検索していますが、問題の適切な解決策が見つかりませんでした。だから私はここで専門家に尋ねています。
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 FileUploadFilterFacesサーブレット
豆
@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); } } } }
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>