Search code examples
javatapestry

Showing images outside my application using Tapestry5


I am developing my first project with Tapestry and I am about to finish, except for the images..

What do I want? I just need to display an image outside my application, example: /home/app/images/image.jpg

What did I try? I have been "googling" and reading Tapestry5 forums, I found this: http://wiki.apache.org/tapestry/Tapestry5HowToStreamAnExistingBinaryFile

I followed the steps, creating classes but I need to display the image embed on another page (so I can't use ImagePage), I tried this:

On page java class

public StreamResponse getImage() {
        InputStream input = DetallesMultimedia.class
                .getResourceAsStream("/home/santi/Escritorio/evolution-of-mario.jpg"); //On application, i will retrieve this from DB
    return new JPEGInline(input,"hellow");
}

On page template

...
<img src="${image}" alt:image/>
...

or

...
${image}
...

Obviusly, this didn't work and I really don't know how can I do it. I read about loading the image on an event (returning the OutputStream on that event, as it's said in the HowTo linked above) but my english is so bad (I am sure you already noticed) and I don't understand well how can I do that.

Could you help me please?

Thanks you all.


Solution

  • I've never seen the examples as on the wiki page. Below some code on how to load an image on the classpath though using a StreamResponse.

    @Inject
    private ComponentResources resources;
    
    @OnEvent(value = "GET_IMAGE_STREAM_EVENT")
    private Object getProfilePic() throws Exception {
    
    
        InputStream openStream = DetallesMultimedia.class.getResourceAsStream("/home/santi/Escritorio/evolution-of-mario.jpg");
        byte[] imageBytes = IOUtils.toByteArray(openStream);
        final ByteArrayInputStream output = new ByteArrayInputStream(imageBytes);
    
        final StreamResponse response = new StreamResponse() {
    
            public String getContentType() {
               "image/jpegOrPngOrGif";
            }
    
            public InputStream getStream() throws IOException {
                return output;
            }
    
            public void prepareResponse(Response response) {
                // add response headers if you need to here
            }
    
        };
        return response;
    }
    
    public String getPicUrl() throws Exception {
        return resources.createFormEventLink("GET_IMAGE_STREAM_EVENT");
    }
    

    In your template:

    <img src="${picUrl}"/>