code: def _upload(self, obj_name, content, content_type, content_encoding,
              content_length, etag, chunked, chunk_size, headers):
          
          if content_type is not None:
              headers["Content-Type"] = content_type
          if content_encoding is not None:
              headers["Content-Encoding"] = content_encoding
          if isinstance(content, six.string_types):
              fsize = len(content)
          else:
              if chunked:
                  fsize = None
              elif content_length is None:
                  fsize = get_file_size(content)
              else:
                  fsize = content_length
          if fsize is None or fsize <= MAX_FILE_SIZE:
              # We can just upload it as-is.
              return self._store_object(obj_name, content=content, etag=etag,
                      chunked=chunked, chunk_size=chunk_size, headers=headers)
          # Files larger than MAX_FILE_SIZE must be segmented
          # and uploaded separately.
          num_segments = int(math.ceil(float(fsize) / MAX_FILE_SIZE))
          digits = int(math.log10(num_segments)) + 1
          # NOTE: This could be greatly improved with threading or other
          # async design.
          for segment in range(num_segments):
              sequence = str(segment + 1).zfill(digits)
              seg_name = "%s.%s" % (obj_name, sequence)
              with utils.SelfDeletingTempfile() as tmpname:
                  with open(tmpname, "wb") as tmp:
                      tmp.write(content.read(MAX_FILE_SIZE))
                  with open(tmpname, "rb") as tmp:
                      # We have to calculate the etag for each segment
                      etag = utils.get_checksum(tmp)
                      self._store_object(seg_name, content=tmp, etag=etag,
                              chunked=False, headers=headers)
          # Upload the manifest
          headers.pop("ETag", "")
          headers["X-Object-Manifest"] = "%s/%s." % (self.name, obj_name)
          self._store_object(obj_name, content=None, headers=headers)
docs: Handles the uploading of content, including working around the 5GB
          maximum file size.