public function listParts($bucketName, $key, $uploadId, $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.'
            );
        }

        list($config, $maxParts, $partNumberMarker) = $this->parseOptions(
            $options,
            BosOptions::CONFIG,
            BosOptions::LIMIT,
            BosOptions::MARKER
        );
        $params = array();
        $params['uploadId'] = $uploadId;
        if ($maxParts !== null) {
            if (is_numeric($maxParts)) {
                $maxParts = number_format($maxParts);
                $maxParts = str_replace(',','',$maxParts);
            }
            $params['maxParts'] = $maxParts;
        }
        if ($partNumberMarker !== null) {
            $params['partNumberMarker'] = $partNumberMarker;
        }

        return $this->sendRequest(
            HttpMethod::GET,
            array(
                BosOptions::CONFIG => $config,
                'bucket_name' => $bucketName,
                'key' => $key,
                'params' => $params,
            )
        );
    }