gpt4 book ai didi

jsf - 显示p :fileupload image in p:graphicImage preview without saving it

转载 作者:行者123 更新时间:2023-12-02 03:38:23 24 4
gpt4 key购买 nike

我正在使用 PrimeFaces 5.3 <p:fileUpload>上传一个 PNG 图像,我想在 <p:graphicImage> 中显示它的预览在保存到数据库之前。

这是一个 MCVE:

<h:form enctype="multipart/form-data">
<p:fileUpload value="#{bean.uploadedFile}" mode="simple" />
<p:graphicImage value="#{bean.image}" />
<p:commandButton action="#{bean.preview}" ajax="false" value="Preview" />
</h:form>

private UploadedFile uploadedFile;

public UploadedFile getUploadedFile() {
return uploadedFile;
}

public void setUploadedFile(UploadedFile uploadedFile) {
this.uploadedFile = uploadedFile;
}

public void preview() {
// NOOP for now.
}

public StreamedContent getImage() {
if (uploadedFile == null) {
return new DefaultStreamedContent();
} else {
return new DefaultStreamedContent(new ByteArrayInputStream(uploadedFile.getContents()), "image/png");
}
}

backing bean 上没有发生错误,并且图像不会在前端加载和显示。客户提到该图像返回了 404 未找到错误。

最佳答案

您的问题有两个方面。它失败了,因为上传的文件内容是请求范围的,并且图像是在不同的 HTTP 请求中请求的。为了更好地理解内部工作原理,请仔细阅读以下密切相关的问答的答案:

要解决第一个问题,您需要在与表单提交关联的操作方法中立即读取上传的文件内容。在您的具体情况下,这看起来像:

private UploadedFile uploadedFile;
private byte[] fileContents;

public void preview() {
fileContents = uploadedFile.getContents();
}

// ...

要解决第二个问题,最好的选择是使用数据 URI 方案。这使得可以在完全相同的响应中直接渲染图像,因此您可以安全地使用 @ViewScoped bean 不会面临“上下文不活动”问题或保存 byte[]在 session 或磁盘中,以便能够在不同的请求中提供图像。 Browser support on data URI scheme目前还不错。替换整个<p:graphicImage>如下:

<ui:fragment rendered="#{not empty bean.uploadedFile}">
<img src="data:image/png;base64,#{bean.imageContentsAsBase64}" />
</ui:fragment>

public String getImageContentsAsBase64() {
return Base64.getEncoder().encodeToString(imageContents);
}

注意:我假设您可以使用 Java 8 java.util.Base64 仅在该版本中引入。如果您使用的是较旧的 Java 版本,请使用 DatatypeConverter.printBase64Binary(imageContents) 相反。

如果您碰巧使用 JSF 实用程序库 OmniFaces ,您也可以只使用它的 <o:graphicImage> 组件,这与<p:graphicImage>相反能够直接引用byte[]InputStream bean 属性并呈现数据 URI。

<o:graphicImage value="#{bean.imageContents}" dataURI="true" rendered="#{not empty bean.imageContents}">

关于jsf - 显示p :fileupload image in p:graphicImage preview without saving it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38817131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com