Thanks Igor, I'll look into this - not something I've tried yet. I was hoping there'd be a short-term tweak to what I already have in place because there are references to that imageResource lookup URL in several spots in my code that I'd now have to go and swap out.
igor.vaynberg wrote: > > why not just create a dead simple servlet that streams images? in fact > there are tons of them online you can just take. it is a much simpler > solution then dealing with wicket's resources for this particular > usecase. > > -igor > > On Wed, Jun 25, 2008 at 7:59 AM, V. Jenks <[EMAIL PROTECTED]> wrote: >> >> I'm having non-stop issues w/ DynamicWebResource and trying to load >> images >> external to my .ear deployment now that I've moved to 1.3. First off, >> I'm >> hoping someone can suggest an easier way to do it because what I have now >> is >> code that someone was nice enough to give me, here on the Wicket mailing >> list. However, I don't entirely understand how it works and while it >> worked >> for 2 years in Wicket 1.2, it is now causing me problem after problem in >> Wicket 1.3.x - for whatever reason. >> >> First what I've got is a class called ImageResource which extends >> DynamicWebResource: >> >> /*****************************************************/ >> public class ImageResource extends DynamicWebResource >> { >> private ImageService imgSrv; >> >> public ImageResource() >> { >> super(); >> imgSrv = new ImageServiceEngine(); >> } >> >> public String getImage(String image) >> { >> String retImg = null; >> >> try >> { >> retImg = imgSrv.getImage(image).toString(); >> } >> catch (IOException exp) >> { >> LogProxy.saveEntry(exp); >> } >> >> return retImg; >> } >> >> protected ResourceState getResourceState() >> { >> ImageResourceState state = null; >> >> try >> { >> ValueMap params = getParameters(); >> >> byte[] data = null; >> String imageId = params.getString("file"); >> >> //Date lastModified = getImageLastMod(imageId); >> state = new ImageResourceState(Time.valueOf(new >> Date())); >> state.setContentType("image/jpeg"); >> >> //SECURITY PRECAUTION - DO NOT ALLOW ANYTHING BUT >> IMAGES! >> if >> (imageId.contains(PropertyProxy.getExternalImagesRoot()) || >> >> imageId.contains(PropertyProxy.getExternalImagesAltRoot())) >> { >> data = imgSrv.getImage(imageId); >> } >> else >> { >> //change image to "not found" warning >> image >> data = >> imgSrv.getImage(PropertyProxy.getImageNotFound()); >> >> //TODO: send email to notify of >> inappropriate access >> } >> >> state.setData(data); >> } >> catch (FileNotFoundException exp) >> { >> LogProxy.saveEntry(exp); >> } >> catch (IOException exp) >> { >> LogProxy.saveEntry(exp); >> } >> catch (NullPointerException exp) >> { >> LogProxy.saveEntry(exp); >> } >> >> return state; >> } >> >> /** >> * >> * @author vjenks >> * >> */ >> protected class ImageResourceState extends ResourceState >> { >> private String contentType; >> private byte[] data; >> private Time lastModified; >> >> ImageResourceState(Time lastModified) >> { >> super(); >> this.lastModified = lastModified; >> } >> >> public String getContentType() >> { >> return contentType; >> } >> >> void setContentType(String contentType) >> { >> this.contentType = contentType; >> } >> >> public byte[] getData() >> { >> return data; >> } >> >> void setData(byte[] data) >> { >> this.data = data; >> } >> >> public int getLength() >> { >> if (data != null) >> return data.length; >> else >> return 0; >> } >> >> public Time lastModifiedTime() >> { >> return lastModified; >> } >> } >> } >> /*****************************************************/ >> >> >> You can see that it uses a class called ImageServiceEngine: >> >> /*****************************************************/ >> public class ImageServiceEngine implements ImageService, Serializable >> { >> private int thumbnailSize; >> >> public ImageServiceEngine() >> { >> super(); >> } >> >> public int getThumbnailSize() >> { >> return this.thumbnailSize; >> } >> >> public void setThumbnailSize(int size) >> { >> this.thumbnailSize = size; >> } >> >> public byte[] getImage(String image) throws IOException >> { >> // Open the file, then read it in. >> ByteArrayOutputStream outStream = new >> ByteArrayOutputStream(); >> InputStream inStream = new FileInputStream(new >> File(image)); >> copy(inStream, outStream); >> inStream.close(); >> outStream.close(); >> return outStream.toByteArray(); >> } >> >> public Date getLastModifyTime(String image) >> { >> File f = new File(image); >> return new Date(f.lastModified()); >> } >> >> /* Spring Injected */ >> private File imageDir; >> >> public void setImageDir(String dirName) >> { >> imageDir = new File(dirName); >> } >> >> public byte[] getThumbnail(String image) throws IOException >> { >> // Open the file, then read it in. >> ByteArrayOutputStream outStream = new >> ByteArrayOutputStream(); >> InputStream inStream = new FileInputStream(new >> File(image)); >> copy(inStream, outStream); >> inStream.close(); >> outStream.close(); >> return outStream.toByteArray(); >> } >> >> /** >> * Copies data from src into dst. >> */ >> private void copy(InputStream source, OutputStream destination) >> throws IOException >> { >> try >> { >> // Transfer bytes from source to destination >> byte[] buf = new byte[1024]; >> int len; >> while ((len = source.read(buf)) > 0) >> { >> destination.write(buf, 0, len); >> } >> source.close(); >> destination.close(); >> } >> catch (IOException ioe) >> { >> throw ioe; >> } >> } >> >> private File createImageFile(String image) >> { >> File file = new File(imageDir, image); >> return file; >> } >> >> >> /** @see ImageService#save(ImageEntry) */ >> public void save(String image, InputStream imageStream) >> throws IOException >> { >> // Read in the image data. >> ByteArrayOutputStream baos = new ByteArrayOutputStream(); >> copy(imageStream, baos); >> baos.close(); >> byte[] imageData = baos.toByteArray(); >> baos = null; >> >> // Create a unique name for the file in the image >> directory and >> // write the image data into it. >> File newFile = createImageFile(image); >> OutputStream outStream = new FileOutputStream(newFile); >> outStream.write(imageData); >> outStream.close(); >> } >> } >> /*****************************************************/ >> >> >> ImageResource is setup in init() in the App class like so: >> >> /*****************************************************/ >> public void init() >> { >> //create external images resource >> getSharedResources().add("imageResource", new ImageResource()); >> } >> /*****************************************************/ >> >> Now, if there's a nicer, cleaner, more simple way of loading external >> images, I'd really appreciate some suggestions. >> >> As for what is now broken, it seems to have something to do w/ the fact >> that >> the Wicket Filter is looking at "/*" to find the application because if I >> use this URL to view an image via my "imageResource" like so: >> >> http://localhost/MyApp/resources/wicket.Application/imageResource?file=C:\\Images\\assets\\images\\newsletter\\test_bkg.jpg >> >> ...I get a 404 not found. This worked fine when my URL had an alias in >> Wicket 1.2, i.e. "/products" instead of the "/*" that is used now. If I >> use >> "/products" in the URL above, as I would have prior to 1.3 (since I have >> it >> listed as a mountable URL in the app class) - it throws an exception >> saying >> "java.lang.IllegalStateException: URL fragment has unmatched key/value >> pair: >> resources/wicket.Application/imageResource" >> >> So, I need help in both areas....one, making this easier, if possible. >> And, >> most importantly - being able to restore production and be able to view >> external images ASAP. >> >> Thanks very much in advance! >> -- >> View this message in context: >> http://www.nabble.com/More-issues-w--external-images-and-DynamicWebResource-tp18114584p18114584.html >> Sent from the Wicket - User mailing list archive at Nabble.com. >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] >> >> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > -- View this message in context: http://www.nabble.com/More-issues-w--external-images-and-DynamicWebResource-tp18114584p18115306.html Sent from the Wicket - User mailing list archive at Nabble.com. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]