如何呈现缓存在托管 bean 中的文件?

How can I render a file cached in a managed bean?

当前版本:JSF 2.1、RichFaces 4.5.2

我遇到了以下问题: 我的一个网页中有一个要上传图片的上传组件:

<h:graphicImage id="uploadedPict" value="__WHAT__?" alt="picture />

<rich:fileUpload id="imageStartUploadComponent"
                 fileUploadListener="#{MyBean.uploadStartImage}"
                 acceptedTypes="png,jpg"
                 immediateUpload="false">
    <a4j:ajax event="uploadcomplete" render="uploadedPict" />
</rich:fileUpload>

和托管 bean 本身:

public class MyBean{

    private UploadedFile detailsImage;

    public void uploadStartImage(){
         //SETTING detailsImage here
    }

    //GET, SET, OTHER STUFF
}

我可以调用 UploadedFile::getData() 方法来检索二进制图像数据。但是我怎样才能将它渲染到网页中呢? value 属性应该分配给实际图片的 URL。所以看来我将不得不编写自己的 servlet...

问题:有没有一种方法可以避免编写 servlet 并直接从返回其二进制数据的托管 bean 方法中渲染图片?

更新:我需要执行此操作以显示上传图片的预览。也许还有另一种方法可以正确做到这一点?

您可以使用 <a4j:mediaOutput>:

<a4j:mediaOutput element="img" mimeType="image/jpeg" 
     createContent="#{bean.paint}" value="#{bean.file}">
</a4j:mediaOutput>

和绘画方法:

public void paint(OutputStream stream, Object object) throws IOException {
    stream.write(((UploadedFile) object).getData());
    stream.close();
}

(勾选 showcase example