Upload a file, returning error if a file with the same "name" attribute exists,
				unless valid file_id (and optionally file_etag,
				to avoid race conditions, raises error 412) is provided.
			folder_id is the id of a folder to put file into,
				but only used if file_id keyword is not passed.

def put(self, path_or_tuple, folder_id='0', file_id=None, file_etag=None):
		'''Upload a file, returning error if a file with the same "name" attribute exists,
				unless valid file_id (and optionally file_etag,
				to avoid race conditions, raises error 412) is provided.
			folder_id is the id of a folder to put file into,
				but only used if file_id keyword is not passed.'''
		name, src = (basename(path_or_tuple), open(path_or_tuple))\
			if isinstance(path_or_tuple, types.StringTypes)\
			else (path_or_tuple[0], path_or_tuple[1])
		folder_id = dict(parent_id=folder_id) if file_id is None else dict()
		return self(
			join('files', 'content') if file_id is None else join('files', bytes(file_id), 'content'),
			method='post', upload=True,
			headers={'If-Match': file_etag} if file_etag else dict(),
			files=dict(filename=(name, src), **folder_id) )