Want to see it live ?
*********************

Notice that for this page, the max upload size is set to 2MB.

Load jQuery
===========

Before anything, to use the whole feature of the plugin, we need to import
`jQuery`::

  <script type="text/javascript"
          src="/%(SCRIPT_NAME)s/gp.fileupload.static/jquery.js"></script>

In our case, `jQuery` is already provided by `Sphinx` so we don't need to include it
twice.

This is an existing html form
=============================

.. raw:: html

  <form method="POST"
        enctype="multipart/form-data"
        action="./demo.html">
    <input type="file" name="file1" />
    <br />
    <input type="submit" />
  </form>

Here is the code::

  <form method="POST"
        enctype="multipart/form-data"
        action="./demo.html">
    <input type="file" name="file1" />
    <br />
    <input type="submit" />
  </form>

This form is automatically bound with the `jquery.fileupload.auto.js` script so
we don't need any javascript code.  

It is totally transparent for your application code since the result page is
your application's result page

This is a form generated with the `fileUpload` plugin
=====================================================

.. raw:: html

  <div id="forms"></div>

  <script language="javascript">
    jQuery(document).ready(function() {
        jQuery('#forms').fileUpload(
              {action:'./demo.html',
               success:function(){alert('Yeah !')}});
    });
  </script>

Here is the code::  

  <div id="forms"></div>

  <script language="javascript">
    jQuery(document).ready(function() {
        jQuery('#forms').fileUpload(
              {action:'./demo.html',
               success:function(){alert('Yeah !')}});
    });
  </script>

This is a static page. How does it work???!!!
=============================================

This page must be served by a `paste.urlparser.StaticURLParser` app. Here is
the code used to consume the `wsgi.input` when needed::

  class FileUploadDemo(object):
      """Wrap a `paste.urlparser.StaticURLParser` to consume stdin if needed
      """

      def __init__(self, application):
          self.application = application

      def __call__(self, environ, start_response):
          if environ['REQUEST_METHOD'] == 'POST':
              if 'gp.fileupload.id' in environ['QUERY_STRING']:
                  # need to consume so see how many block we have to read
                  bsize = 1024
                  length = int(environ['CONTENT_LENGTH'])
                  blocks = [bsize for i in range(bsize, length, bsize)]
                  blocks.append(length-len(blocks)*bsize)

                  # read input an write to /dev/null :)
                  rfile = environ['wsgi.input']
                  [rfile.read(size) for size in blocks]

          # StaticURLParser only serve GET
          environ['REQUEST_METHOD'] = 'GET'
          return self.application(environ, start_response)

And the application factory::

  from paste.urlmap import URLMap
  from paste.urlparser import StaticURLParser
  from gp.fileupload import make_app as make_fileupload

  def make_app(global_conf, **kw):
      map = URLMap({})
      app = StaticURLParser('/where/is/my/doc')
      map['/gp.fileupload'] = make_fileupload(
                                FileUploadDemo(app),
                                global_conf,
                                tempdir=kw.get('tempdir'),
                                max_size='2',
                                include_files=['fileupload.css',
                                               'jquery.fileupload.*'])
      return map

