Hi all,

I am having a little difficulty with what I imagine is a very common use
case: displaying a user's profile image alongside their personal details
following successful login.  Displaying the JavaBean strings served up by
Hibernate is easy.  Just displaying the database Blob (stored as a byte
array in the JavaBean entity) is proving more challenging.


[Welcome.tml]

    ...
    <div>
        <img src="${imageLink}" />
        <strong>${user.firstName} ${user.lastName}</strong><br/>
        User name: "${user.userName}"<br/>
        E-mail: ${user.email}<br/>
    </div>
    ...


[Welcome.java]

    ...
    public void onActivate(){
        user = authenticator.getLoggedUser();

        company = user.getCompany();

        ports = company.getPorts();
    }


    public Link getImageLink(){
        return pageLink.createPageRenderLinkWithContext(BlobImage.class,
user.getImage());
    }
    ...


[BlobImage.java]

package com.example.harbour.pages;

import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.services.Response;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Class created for displaying Blob (profile) images read from the
database, as per the below howto:
 *
https://stackoverflow.com/questions/13213236/tapestry-display-blob-using-markup
 */
public class BlobImage {

    public StreamResponse onActivate(byte[] byteArray){

        //Retrieve your image using the context parameter(s)
        final InputStream imageStream = new ByteArrayInputStream(byteArray);

        return new StreamResponse(){

            @Override
            public InputStream getStream() throws IOException {
                return imageStream;
            }

            @Override
            String getContentType(){
                return "image/png";
            }

            @Override
            void prepareResponse(Response response){}
        };
    }
}


[The Compilation Error]

[ERROR] Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile
(default-compile) on project harbour: Compilation failure: Compilation
failure:
[ERROR]
\Users\Setup\Desktop\IdeaProjects\Harbour\src\main\java\com\example\harbour\pages\BlobImage.java:[37,17]
error: prepareResponse(Response) in <anonymous
com.example.harbour.pages.BlobImage$1> cannot implement
prepareResponse(Response) in StreamResponse
[ERROR]
\Users\Setup\Desktop\IdeaProjects\Harbour\src\main\java\com\example\harbour\pages\BlobImage.java:[32,19]
error: getContentType() in <anonymous
com.example.harbour.pages.BlobImage$1> cannot implement getContentType()
in StreamResponse


Is creating a separate image streaming class, like above, the best way of
displaying a database image in a Tapestry 5 template, as the 'howto' I
followed is 5+ years' old now?  I couldn't find any newer examples on the
Tapestry website.

Thanks for your assistance,

Chris.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to