Maybe this is easier, my version uses a database but you can just adapt it to 
read from the file system:

/**
 * A component to retrieve and render a given image 
 * @author Peter Stavrinides
 * 
 */
public class PersonPhoto extends PageBase{
        
        
        @Inject
        private ComponentResources resources_;

        @Parameter(name = "pId", required = true)
        private int pId_;

        /** The alternative title of the image */
        @Parameter(name = "title", required = true)
        private String title_;

        /**
         * Renders a photo 
         */
        @BeginRender
        protected boolean beginRender(MarkupWriter writer) throws SQLException {
                ImageIcon image = null;
                
                //this simply returns a byte[]
                image = new ImageIcon(photo.getPhoto()) 

                // Write an action link for this photo
                final Link link = resources_.createEventLink("photo", new 
Object[] { pId_ });
                writer.element("img", "src", link, "title", title_, "alt", 
"Loading "
                                + title_, "height", image.getIconHeight(), 
"width", image
                                .getIconWidth());
                resources_.renderInformalParameters(writer);
                
                writer.end();
                return true;
        }

        /**
         * Ends the rendering of the image tag
         * 
         * @param writer
         *            the mark-up write
         */
        @AfterRender
        protected void afterRender(MarkupWriter writer) {
                //writer.end();
        }

        /**
         * Render the photo to a stream.
         * @return the Stream response
         */
        public StreamResponse onPhoto() {
                
                        //once again the byte array
                        final ByteArrayInputStream stream = new 
ByteArrayInputStream(photo
                                        .getPhoto());
                        return new StreamResponse() {
                                public String getContentType() {
                                        return "image/jpg";
                                }

                                public InputStream getStream() {
                                        return stream;
                                }

                                public void prepareResponse(Response response) {
                                        // Nothing to be done
                                }
                        };
        }
}

Its that simple.

Peter

----- Original Message -----
From: "Andy Pahne" <andy.pa...@googlemail.com>
To: "Tapestry users" <users@tapestry.apache.org>
Sent: Wednesday, 11 March, 2009 14:27:53 GMT +02:00 Athens, Beirut, Bucharest, 
Istanbul
Subject: Re: Image Asset Help Needed

Peter Kanze schrieb:
> Hi Andy,
>
> Yes I read that thread, I started that thread as well.
> I will vote for the issue, but the problem is I need a solution now..
>
> Maybe I add a good old servlet that returns the image....
> Any other ideas?
>
>   


Yeah, that was my workaround.



> Regards,
> Peter
>
>
> On Wed, Mar 11, 2009 at 12:49 PM, Andy Pahne <andy.pa...@googlemail.com>wrote:
>
>   
>> Did you read the thread "How to load image Asset from filesystem"?
>>
>> You might want to vote for the issue.
>>
>> Regards,
>> Andy
>>
>>
>> Peter Kanze schrieb:
>>
>>  Here am I again.
>>     
>>> I am struggling for 2 days now to load an image from the filesystem into
>>> my
>>> webpage.
>>> The image needs to be loaded based on the product id.
>>>
>>> The steps I did was:
>>>
>>> 1. Implemented a FileSystemAssetFactory based on the ClasspathAssetFactory
>>> 2. Implemented a FileSystemResource;
>>> See the code below:
>>> In my html the following code is generated:
>>>
>>> <img src="
>>>
>>> /advertaza/assets/classpath/6675930334be219a/C:/tmp/pictures/8/71/1001/thumb1.jpg
>>> " alt=""/>
>>>
>>> As you can see the file system path is exposed into the webpage. I don't
>>> want this.
>>> The second problem is that the image is not loaded/visible in the webpage.
>>>
>>> What am I doing wrong? Are there tapestry guru's who can help me out?
>>>
>>> Thanks,
>>> Peter
>>>
>>> /*
>>> *My quick example code
>>> */
>>>
>>> public String getThumbnailPath() {
>>>         Asset asset = assetSource.getAsset(null,
>>> "file:/8/71/1001/thumb1.jpg", null);
>>>         return asset.toClientURL();
>>>    }
>>> public class FileSystemAssetFactory implements AssetFactory {
>>>
>>>    private final ClasspathAssetAliasManager aliasManager;
>>>
>>>    private final Map<Resource, String> resourceToDefaultPath =
>>> CollectionFactory.newConcurrentMap();
>>>
>>>    private final FileSystemResource rootResource;
>>>
>>>    private final AssetPathConverter converter;
>>>
>>>    private final boolean invariant;
>>>
>>>
>>>    public FileSystemAssetFactory(ClasspathAssetAliasManager aliasManager,
>>> AssetPathConverter converter) {
>>>        this.aliasManager = aliasManager;
>>>        this.converter = converter;
>>>
>>>        rootResource = new FileSystemResource("C:/tmp/pictures/");
>>>        invariant = converter.isInvariant();
>>>    }
>>>
>>>
>>>    private String clientURL(Resource resource) {
>>>        String defaultPath = resourceToDefaultPath.get(resource);
>>>
>>>        if (defaultPath == null) {
>>>            defaultPath = buildDefaultPath(resource);
>>>
>>>            resourceToDefaultPath.put(resource, defaultPath);
>>>        }
>>>
>>>        return converter.convertAssetPath(defaultPath);
>>>    }
>>>
>>>    private String buildDefaultPath(Resource resource) {
>>>        //boolean requiresDigest = cache.requiresDigest(resource);
>>>
>>>        String path = resource.getPath();
>>>        int lastdotx = path.lastIndexOf('.');
>>>        path = path.substring(0, lastdotx + 1)  + path.substring(lastdotx);
>>>
>>>          return aliasManager.toClientURL(path);
>>>    }
>>>
>>>    public Asset createAsset(final Resource resource) {
>>>        return new AbstractAsset(invariant) {
>>>            public Resource getResource() {
>>>                return resource;
>>>            }
>>>
>>>            public String toClientURL() {
>>>                return clientURL(resource);
>>>            }
>>>        };
>>>    }
>>>
>>>    public Resource getRootResource() {
>>>        return rootResource;
>>>    }
>>>
>>> }
>>>
>>> public class FileSystemResource extends AbstractResource {
>>>
>>>    private static final int PRIME = 37;
>>>
>>>    /**
>>>     * Constructor with the root path
>>>     * @param path the root
>>>     */
>>>    public FileSystemResource(String path) {
>>>        super(path);
>>>    }
>>>
>>>    /**
>>>     *
>>>     */
>>>    @Override
>>>    protected Resource newResource(String path) {
>>>        return new FileSystemResource(path);
>>>    }
>>>
>>>    @Override
>>>    public URL toURL() {
>>>        String filePath = getPath();
>>>        File file = new File(filePath);
>>>
>>>        if (file != null && file.exists()) {
>>>            try {
>>>                return file.toURL();
>>>            }
>>>            catch (MalformedURLException ex) {
>>>                throw new RuntimeException(ex);
>>>            }
>>>        }
>>>        return null;
>>>    }
>>>
>>>    @Override
>>>    public String toString() {
>>>        return getPath();
>>>    }
>>>
>>>    @Override
>>>    public int hashCode() {
>>>        return PRIME * getPath().hashCode();
>>>    }
>>>
>>>    @Override
>>>    public boolean equals(Object obj) {
>>>        if (this == obj)
>>>            return true;
>>>        if (obj == null)
>>>            return false;
>>>        if (getClass() != obj.getClass())
>>>            return false;
>>>
>>>        final FileSystemResource other = (FileSystemResource) obj;
>>>
>>>        return getPath().equals(other.getPath());
>>>    }
>>>
>>> }
>>>
>>>
>>>
>>>       
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
>> For additional commands, e-mail: users-h...@tapestry.apache.org
>>
>>
>>     
>
>   


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


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

Reply via email to