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')
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()
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'
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'