code: def _do_upload(
          self, client, stream, content_type, size, num_retries, predefined_acl
      ):
          
          if size is not None and size <= _MAX_MULTIPART_SIZE:
              response = self._do_multipart_upload(
                  client, stream, content_type, size, num_retries, predefined_acl
              )
          else:
              response = self._do_resumable_upload(
                  client, stream, content_type, size, num_retries, predefined_acl
              )
  
          return response.json()
docs: Determine an upload strategy and then perform the upload.
  
          If the size of the data to be uploaded exceeds 5 MB a resumable media
          request will be used, otherwise the content and the metadata will be
          uploaded in a single multipart upload request.
  
          The content type of the upload will be determined in order
          of precedence:
  
          - The value passed in to this method (if not :data:`None`)
          - The value stored on the current blob
          - The default value ('application/octet-stream')
  
          :type client: :class:`~google.cloud.storage.client.Client`
          :param client: (Optional) The client to use.  If not passed, falls back
                         to the ``client`` stored on the blob's bucket.
  
          :type stream: IO[bytes]
          :param stream: A bytes IO object open for reading.
  
          :type content_type: str
          :param content_type: Type of content being uploaded (or :data:`None`).
  
          :type size: int
          :param size: The number of bytes to be uploaded (which will be read
                       from ``stream``). If not provided, the upload will be
                       concluded once ``stream`` is exhausted (or :data:`None`).
  
          :type num_retries: int
          :param num_retries: Number of upload retries. (Deprecated: This
                              argument will be removed in a future release.)
  
          :type predefined_acl: str
          :param predefined_acl: (Optional) predefined access control list
  
          :rtype: dict
          :returns: The parsed JSON from the "200 OK" response. This will be the
                    **only** response in the multipart case and it will be the
                    **final** response in the resumable case.