code: def upload_part(self, bucket, object_name, upload_id, part_number,
                      data=None, content_type=None, metadata={},
                      body_producer=None):
          
          parms = 'partNumber=%s&uploadId=%s' % (str(part_number), upload_id)
          objectname_plus = '%s?%s' % (object_name, parms)
          details = self._details(
              method=b"PUT",
              url_context=self._url_context(bucket=bucket, object_name=objectname_plus),
              headers=self._headers(content_type),
              metadata=metadata,
              body=data,
          )
          d = self._submit(self._query_factory(details))
          d.addCallback(lambda (response, data): _to_dict(response.responseHeaders))
          return d
docs: Upload a part of data corresponding to a multipart upload.
  
          @param bucket: The bucket name
          @param object_name: The object name
          @param upload_id: The multipart upload id
          @param part_number: The part number
          @param data: Data (optional, requires body_producer if not specified)
          @param content_type: The Content-Type
          @param metadata: Additional metadata
          @param body_producer: an C{IBodyProducer} (optional, requires data if
              not specified)
          @return: the C{Deferred} from underlying query.submit() call