def upload(self, file_path, folder_id=None):
mime_type, _ = guess_type(file_path)
mime_type = 'application/octet-stream' if mime_type is None else mime_type
file_name = os.path.basename(file_path)
self._debug('upload - %s(%s) => %s', file_name, mime_type,
folder_id if folder_id is not None else 'root')
file_stats = os.stat(file_path)
file_name_encoded = unicode(file_name, "utf-8", errors="ignore")
description = dict(name=file_name_encoded, size=str(file_stats.st_size))
if folder_id is not None:
description['folder'] = folder_id
def send():
with open(file_path, 'rb') as f:
uri = '/files/content'
m = MultipartEncoder(
fields=dict(description=json.dumps(dict(description)),
file=(file_name_encoded, f, mime_type))
)
response = self._call(self.client.post, '%s%s%s' % (URL_UPLOAD, BASE_URI, uri),
data=m,
headers={'Content-Type': m.content_type})
self._debug('upload - %s - %s', file_name, response.text)
return AbstractDomain._read_response(response)
try:
return send()
except ClientError, ex:
if Files._is_token_expired_on_upload(ex.response):
self._logger.info('upload - token invalid - refreshing token')
self.client._refresh_token()
send()
else:
raise
except ConnectionError, conn:
if len(conn.args) == 1 and type(conn.args[0]) == ProtocolError :
protocol_error = conn.args[0]
if len(protocol_error.args) == 2:
str_error, error = protocol_error.args
if error.errno == errno.ECONNRESET:
self._logger.info('upload - connection reset - refreshing token')
self.client._refresh_token()
self._logger.info('upload - resending the payload')
return send()
raise
except BaseException, ex:
self._logger.error('upload - unmanaged exception - %s', type(ex))
评论列表
文章目录