public function completeMultipartUpload(
        $bucketName,
        $key,
        $uploadId,
        array $partList,
        $options = array()
    ) {
        if (empty($bucketName)) {
            throw new \InvalidArgumentException(
                '$bucketName should not be empty or null.'
            );
        }
        if (empty($key)) {
            throw new \InvalidArgumentException(
                '$key should not be empty or null.'
            );
        }
        if (empty($uploadId)) {
            throw new \InvalidArgumentException(
                '$uploadId should not be empty or null.'
            );
        }

        $headers = array();
        $this->populateRequestHeadersWithOptions($headers, $options);
        list($config) = $this->parseOptions($options, BosOptions::CONFIG);

        return $this->sendRequest(
            HttpMethod::POST,
            array(
                BosOptions::CONFIG => $config,
                'bucket_name' => $bucketName,
                'key' => $key,
                'body' => json_encode(array('parts' => $partList)),
                'headers' => $headers,
                'params' => array('uploadId' => $uploadId),
            )
        );
    }