def upload(self, dest_dir, file_handler, filename, callback=None, **kwargs):
params = {<EOL>'<STR_LIT:path>':str(dest_dir)+"<STR_LIT:/>"+str(filename)<EOL>}<EOL>tmp_filename = '<STR_LIT>'.join(random.sample(string.ascii_letters, <NUM_LIT:10>))<EOL>files = {'<STR_LIT:file>': (tmp_filename, file_handler)}<EOL>url = '<STR_LIT>'.format(BAIDUPCS_SERVER)<EOL>return self._request('<STR_LIT:file>', '<STR_LIT>', url=url, extra_params=params,<EOL>files=files, callback=callback, **kwargs)<EOL>
上传单个文件（<2G）.

        | 百度PCS服务目前支持最大2G的单个文件上传。
        | 如需支持超大文件（>2G）的断点续传，请参考下面的“分片文件上传”方法。

        :param dest_dir: 网盘中文件的保存路径（不包含文件名）。
                            必须以 / 开头。

                            .. warning::
                                * 注意本接口的 dest_dir 参数不包含文件名，只包含路径
                                * 路径长度限制为1000；
                                * 径中不能包含以下字符：``\\\\ ? | " > < : *``；
                                * 文件名或路径名开头结尾不能是 ``.``
                                  或空白字符，空白字符包括：
                                  ``\\r, \\n, \\t, 空格, \\0, \\x0B`` 。
        :param file_handler: 上传文件对象 。(e.g. ``open('foobar', 'rb')`` )

                            .. warning::
                                注意不要使用 .read() 方法.
        :type file_handler: file
        :param callback: 上传进度回调函数
            需要包含 size 和 progress 名字的参数

        :param filename:

        :return: requests.Response 对象

            .. note::
                返回正确时返回的 Reponse 对象 content 中的数据结构

                {"path":"服务器文件路径","size":文件大小,"ctime":创建时间,"mtime":修改时间,"md5":"文件md5值","fs_id":服务器文件识别号,"isdir":是否为目录,"request_id":请求识别号}