Hi uudashr, I gotta tell you've done terrific work! I tried it in my wicket-GAE app and it worked :)

Comments/questions:

About wicket framework:
1- Is it possibly that the MultipartServletWebRequest can have this line:
DiskFileItemFactory factory = new DiskFileItemFactory();
...changed for...
DiskFileItemFactory factory = getFileItemFactory(); // and this would be a protected method that would instanciate the DiskFileItemFactory by default If that change could be done, instead of generate an exact copy of MultipartServletWebRequest with that line different, we could just extend it and override getFileItemFactory() method.

2- Once this code is properly review, where should be added? I'm not sure that the wicket base framework would be the best place. But what about some kind of wicket-gae-extension?

About your code:
1- In the classic "onSubmit()" in a form, what's the way I should store the final file? a) OutputStream fos = new DatastoreOutputStream(fileName); fos.write(fileUpload.getInputStream().toByteArray()) (y tried this option first and it didn't work, but i'm not sure I used it the right way) b) FileStorage.instance().write(fileUpload.getInputStream(), filename); (this option worked :))

2- I also found an "issue" related to the DATA_CHUNK_SIZE.
In your code this is declared as DATA_CHUNK_SIZE = (int)(Bytes.megabytes(1).bytes() - Bytes.kilobytes(10).bytes()); In development environment worked fine, however, when using in production environment (google's magic servers), an error ocurred. I didn't copy the stack trace, but it said that the maximun entity (or property, can't remember) size had been reached for the field "data" (which of course has the file data). It said the maximun was "1000000 characters" (actually less than a Megabyte?, which should be 1024*1024bytes?, maybe google app engine documentation needs a fix, not quite sure about this). And strangely, in that case the file uploaded had a size of 14Kb.

Finally, we reduced DATA_CHUNK_SIZE to 512Kb, and it worked fine. Anyway, I wanted to let you know so you can take a look.


Regards!


Daniele Dellafiore escribió:
Great, seems interesting, I will give this a try. Thanks.

On Sun, Aug 30, 2009 at 6:31 PM, uud ashr <[email protected]> wrote:

Hi all
Just want to share.
If you have problem with file upload on Google App Engine, I just done some
experiment and it works.
Use the attached files.
I didn't create this, I just modify from the existing wicket source code.

I create new class, GaeSafeServletWebRequest which is subclass of
ServletWebRequest. Everyting come from here.

The key is remove the thread that clean the ReferenceQueue. So how to clean
it? I use something called FileCleaner.reapFiles(2) that will poll the queue
maximum 2 item. I put those line of code everytime GaeSafeServletWebRequest
created.

to use, you only need to override method *newWebRequest* on your wicket
application

    @Override

    protected WebRequest newWebRequest(final HttpServletRequest
servletRequest) {

        return new GaeSafeServletWebRequest(servletRequest);

    }


When you upload something, then write it using *DatastoreOutputStream*, it
will put all the bytes to GAE (Google App Engine) datastore. This
OutputStream already handle the over size, so it will create chunk files in
order to save the big file size.

Please tell me if it works for you (actually it works for me) and maybe we
can refine or create the better code. Or maybe we can add this to wicket? So
wicket can be "FULL COMPATIBLE" to Google App Engine.

Regards,
uudashr


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