Thank you for the advice. Here's the solution I came up with, in case
it's useful to anyone else.

First I used the DownloadLink as a template for my "blobDownloadLink".
Then I created an InputStreamResourceStream, which is essentially a
barely modified version of Wicket's FileResourceStream, taking an
InputStream as the constructor parameter instead of a File. The code for
both of those is below.

While this solution works, the two issues still hanging in my mind are:
1. I'm sure there's an easier way to get the InputStream into an
IResourceStream than to create an InputStreamResourceStream class...I
just couldn't figure out what it is.
2. When I get the Blob from the database like this, 

        rs.getBinaryStream(1);

the returned BinaryStream doesn't work. Doing this,

        java.sql.Blob blob = rs.getBlob(1);
        return blob.getBinaryStream();

doesn't work either. So I ended up doing,

        java.sql.Blob blob = rs.getBlob(1);
        byte[] bytes = new byte[(int)blob.length()];
        try {
                blob.getBinaryStream().read(bytes);
        } catch (IOException ioe) {
                // handle it
        }
        return new ByteArrayInputStream(bytes);

Not pretty, but it works.

*******
// Relevant code for blobDownloadLink

Link blobDownloadLink = new Link("blobDownloadLink") {
                                @Override
                                public void onClick() {
                                        InputStream inputStream =
//getBlobAsInputStreamFromDatabase();
                                        
                                        IResourceStream resourceStream =
new InputStreamResourceStream(inputStream);
 
getRequestCycle().setRequestTarget(new
ResourceStreamRequestTarget(resourceStream)
                                        {
                                                public String
getFileName()
                                                {
                                                        return
//theFileNameYouWantAssociatedWithThisDownload;
                                                }

                                                public void
respond(RequestCycle requestCycle)
                                                {
 
super.respond(requestCycle);

                                                }
                                        });
                                        
                                        try {
                                                inputStream.close();
                                        } catch (IOException ioe) {
                                                logger.error("Error
attempting to close inputStream in blobDownloadLink.", ioe);
                                        }
                                };
                        };

********
// Relevant code for InputStreamResourceStream

import java.io.IOException;
import java.io.InputStream;
import org.apache.wicket.util.resource.AbstractResourceStream;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;

/**
 * An InputStreamResourceStream is an IResource implementation for
files.
 * 
 * @see org.apache.wicket.util.resource.IResourceStream
 * @see org.apache.wicket.util.watch.IModifiable
 * @author Dane Laverty
 */
public class InputStreamResourceStream extends AbstractResourceStream
{
        private static final long serialVersionUID = 1L;

        /** Resource stream */
        private transient InputStream inputStream;

        /**
         * Constructor.
         * 
         * @param inputStream
         *            [EMAIL PROTECTED] InputStream} containing resource
         */
        public InputStreamResourceStream(InputStream inputStream)
        {
                this.inputStream = inputStream;
        }

        /**
         * Closes this resource.
         * 
         * @throws IOException
         */
        public void close() throws IOException
        {
                if (inputStream != null)
                {
                        inputStream.close();
                        inputStream = null;
                }
        }

        /**
         * @see IResourceStream#getContentType()
         */
        public String getContentType()
        {
                // Let ResourceStreamRequestTarget handle content-type
automatically
                return null;
        }

        /**
         * @return A readable input stream for this resource. The same
input stream is returned until
         *         <tt>InputStreamResourceStream.close()</tt> is
invoked.
         * 
         * @throws ResourceStreamNotFoundException
         */
        public InputStream getInputStream() throws
ResourceStreamNotFoundException
        {
                if (inputStream == null)
                        throw new
ResourceStreamNotFoundException("InputStream could not be found");

                return inputStream;
        }

}
        

-----Original Message-----
From: Igor Vaynberg [mailto:[EMAIL PROTECTED] 
Sent: Friday, October 10, 2008 3:37 PM
To: users@wicket.apache.org
Subject: Re: Downloading a BLOB

i didnt say use the downloadlink, i said see how it works...

-igor

On Fri, Oct 10, 2008 at 3:32 PM, Dane Laverty
<[EMAIL PROTECTED]> wrote:
> DownloadLink appears to accept only a file pathname. If I understand
it
> correctly, the only way I could use that would be to read the BLOB
into
> a file on the server, and then have the DownloadLink point to that
file.
> I believe that would require me to have the file created when the page
> is generated, rather than when the link is clicked. Since there are
> going to be many links on this page, I would rather be able to wait
> until the user clicks the link to stream the BLOB to them.
>
> -----Original Message-----
> From: Igor Vaynberg [mailto:[EMAIL PROTECTED]
> Sent: Friday, October 10, 2008 3:26 PM
> To: users@wicket.apache.org
> Subject: Re: Downloading a BLOB
>
> see how downloadlink works
>
> -igor
>
> On Fri, Oct 10, 2008 at 3:21 PM, Dane Laverty
> <[EMAIL PROTECTED]> wrote:
>> The title basically says it all. I've got a BLOB in a database, and I
>> want the user to be able to click a link and download it. Any wicket
>> solutions to do this? Thanks much.
>>
>>
>>
>>
>
> ---------------------------------------------------------------------
> 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]
>
>

---------------------------------------------------------------------
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]

Reply via email to