Middleware that provides the ability to upload objects to a cluster using an HTML form POST. The format of the form is:
<![CDATA[ <form action="<swift-url>" method="POST" enctype="multipart/form-data"> <input type="hidden" name="redirect" value="<redirect-url>" /> <input type="hidden" name="max_file_size" value="<bytes>" /> <input type="hidden" name="max_file_count" value="<count>" /> <input type="hidden" name="expires" value="<unix-timestamp>" /> <input type="hidden" name="signature" value="<hmac>" /> <input type="file" name="file1" /><br /> <input type="submit" /> </form>]]>
The swift-url
is the URL to the Swift
destination, such as:
https://swift-cluster.example.com/v1/AUTH_account/container/object_prefix
The name of each file uploaded is appended to the
specified swift-url
. So, you can upload
directly to the root of container with a url like:
https://swift-cluster.example.com/v1/AUTH_account/container/
Optionally, you can include an object prefix to better
separate different users’ uploads, such as:
https://swift-cluster.example.com/v1/AUTH_account/container/object_prefix
Note the form method must be POST and the enctype must
be set as multipart/form-data
.
The redirect attribute is the URL to redirect the
browser to after the upload completes. The URL will have
status and message query parameters added to it,
indicating the HTTP status code for the upload (2xx is
success) and a possible message for further information if
there was an error (such as “max_file_size
exceeded”
).
The max_file_size
attribute must be
included and indicates the largest single file upload that
can be done, in bytes.
The max_file_count
attribute must be
included and indicates the maximum number of files that
can be uploaded with the form. Include additional
<![CDATA[<input type="file"
name="filexx"/>]]>
attributes if
desired.
The expires attribute is the Unix timestamp before which the form must be submitted before it is invalidated.
The signature attribute is the HMAC-SHA1 signature of the form. This sample Python code shows how to compute the signature:
import hmac from hashlib import sha1 from time import time path = '/v1/account/container/object_prefix' redirect = 'https://myserver.com/some-page' max_file_size = 104857600 max_file_count = 10 expires = int(time() + 600) key = 'mykey' hmac_body = '%s\n%s\n%s\n%s\n%s' % (path, redirect, max_file_size, max_file_count, expires) signature = hmac.new(key, hmac_body, sha1).hexdigest()
The key is the value of the
X-Account-Meta-Temp-URL-Key
header
on the account.
Be certain to use the full path, from the
/v1/
onward.
The command line tool swift-form-signature may be used (mostly just when testing) to compute expires and signature.
The file attributes must appear after the other attributes to be processed correctly. If attributes come after the file, they are not sent with the sub-request because on the server side, all attributes in the file cannot be parsed unless the whole file is read into memory and the server does not have enough memory to service these requests. So, attributes that follow the file are ignored.
Configuration option=Default value | Description |
use=egg:swift#formpost | Entry point of paste.deploy in the server |