File Uploading — Grab 0.6 documentation

# File Uploading

To upload file you should use UploadFile or UploadContent classes.

UploadFile example:

    from grab import Grab, UploadFile

    g = Grab()
    g.setup(post={'image': UploadFile('/path/to/image.jpg')})
    g.go('http://example.com/form.php')

UploadContent example:

    from grab import Grab, UploadContent

    g = Grab()
    g.setup(post={'image': UploadContent('......', filename='image.jpg')})
    g.go('http://example.com/form.php')

## Form Processing

You can use UploadFile and UploadContent in all methods that set values in form fields:

    from grab import Grab, UploadFile

    g = Grab()
    g.go('http://example.com/form.php')
    g.doc.set_input('image', UploadFile('/path/to/image.jpg'))
    g.doc.submit()

## Custom File Name

With both UploadFile and UploadContent you can use custom filename.

If you do not specify filename then:

- UploadFile will use the filename extracted from the path to the file passed in first argument.

- UploadContent will generate random file name

    >>> from grab import UploadFile, UploadContent
    >>> UploadFile('/path/to/image.jpg').filename
    'image.jpg'
    >>> UploadFile('/path/to/image.jpg', filename='avatar.jpg').filename
    'avatar.jpg'
    >>> UploadContent('.....').filename
    '528e418951'
    >>> UploadContent('.....', filename='avatar.jpg').filename
    'avatar.jpg'

## Custom Content Type

With both UploadFile and UploadContent you can use custom content type.

If you do not specify content type then filename will be used to guess the content type e.g. “image.jpg” will have “image/jpeg” content type and “asdfasdf” will be just a “application/octet-stream”

    >>> from grab import UploadFile, UploadContent
    >>> UploadFile('/path/to/image.jpg').content_type
    'image/jpeg'
    >>> UploadFile('/path/to/image.jpg', content_type='text/plain').content_type
    'text/plain'
    >>> UploadContent('/path/to/image.jpg').content_type
    'image/jpeg'
    >>> UploadContent('...', content_type='text/plain').content_type
    'text/plain'