complete_multipart_upload ( $bucket, $filename, $upload_id, $parts, $opt )

Completes an in-progress multipart upload. A multipart upload is completed by describing the part numbers and corresponding ETag values in order, and submitting that data to Amazon S3 as an XML document.

Access

public

Parameters

Parameter

Type

Required

Description

$bucket

string

Required

The name of the bucket to use.

$filename

string

Required

The file name for the object.

$upload_id

string

Required

The upload ID identifying the multipart upload whose parts are being listed. The upload ID is retrieved from a call to initiate_multipart_upload().

$parts

string
array
SimpleXMLElement
CFResponse

Required

The completion XML document. This document can be provided in multiple ways; as a string of XML, as a SimpleXMLElement object representing the XML document, as an indexed array of associative arrays where the keys are PartNumber and ETag, or as a CFResponse object returned by list_parts().

$opt

array

Optional

An associative array of parameters that can have the following keys:

  • curlopts - array - Optional - A set of values to pass directly into curl_setopt(), where the key is a pre-defined CURLOPT_* constant.
  • returnCurlHandle - boolean - Optional - A private toggle specifying that the cURL handle be returned rather than actually completing the request. This toggle is useful for manually managed batch requests.

Returns

Type

Description

CFResponse

A CFResponse object containing a parsed HTTP response.

Examples

Complete a multipart upload using a response from list_parts().

  1. Initiate a new multipart upload using initiate_multipart_upload().
  2. Upload the parts using upload_part().
  3. Complete the upload using complete_multipart_upload().
// Instantiate the class
$s3 = new AmazonS3();

$bucket = 'my-bucket' . strtolower($s3->key);
$filename = 'movie.mp4';
$upload_id = 'f_JM_zwhU37pj1tS.F2BXVWUJtGcNso1WEikZImjrBCYUbUQwNnOUwX.Z00O1QmKQXAjqQBD4BVZRGmEXAMPLE--';

// Get a list of up to 1000 parts
$parts = $s3->list_parts($bucket, $filename, $upload_id);

// Initiate a new multipart upload
$response = $s3->complete_multipart_upload($bucket, $filename, $upload_id, $parts);

// Success?
var_dump($response->isOK());
Result:
bool(true)

Complete a multipart upload using a string.

$xml = <<<HTML
<?xml version="1.0" encoding="utf-8"
<CompleteMultipartUpload>
<Part>
	<PartNumber>1</PartNumber>
	<ETag>"25e317773f308e446cc84c503a6d1f85"</ETag>
</Part>
<Part>
	<PartNumber>2</PartNumber>
	<ETag>"25e317773f308e446cc84c503a6d1f85"</ETag>
</Part>
<Part>
	<PartNumber>3</PartNumber>
	<ETag>"bed3c0a4a1407f584989b4009e9ce33f"</ETag>
</Part>
</CompleteMultipartUpload>
HTML;

// Instantiate the class
$s3 = new AmazonS3();

$bucket = 'my-bucket' . strtolower($s3->key);
$filename = 'movie.mp4';
$upload_id = 'f_JM_zwhU37pj1tS.F2BXVWUJtGcNso1WEikZImjrBCYUbUQwNnOUwX.Z00O1QmKQXAjqQBD4BVZRGmEXAMPLE--';

// Get a list of up to 1000 parts
$parts = $s3->list_parts($bucket, $filename, $upload_id);

// Initiate a new multipart upload
$response = $s3->complete_multipart_upload($bucket, $filename, $upload_id, $xml);

// Success?
var_dump($response->isOK());
Result:
bool(true)

Complete a multipart upload using an array.

// Instantiate the class
$s3 = new AmazonS3();

$bucket = 'my-bucket' . strtolower($s3->key);
$filename = 'movie.mp4';
$upload_id = 'f_JM_zwhU37pj1tS.F2BXVWUJtGcNso1WEikZImjrBCYUbUQwNnOUwX.Z00O1QmKQXAjqQBD4BVZRGmEXAMPLE--';

// Get a list of up to 1000 parts
$parts = $s3->list_parts($bucket, $filename, $upload_id);

// Initiate a new multipart upload
$response = $s3->complete_multipart_upload($bucket, $filename, $upload_id, array(
	array('PartNumber' => 1, 'ETag' => '"25e317773f308e446cc84c503a6d1f85"'),
	array('PartNumber' => 2, 'ETag' => '"a6d1f85f58498973f308e446cc84c503"'),
	array('PartNumber' => 3, 'ETag' => '"bed3c0a4a1407f584989b4009e9ce33f"'),
));

// Success?
var_dump($response->isOK());
Result:
bool(true)

Source

Method defined in services/s3.class.php | Toggle source view (57 lines) | View on GitHub

public function complete_multipart_upload($bucket, $filename, $upload_id, $parts, $opt = null)
{
    if (!$opt) $opt = array();

    // Add this to our request
    $opt['verb'] = 'POST';
    $opt['resource'] = $filename;
    $opt['uploadId'] = $upload_id;
    $opt['headers'] = array(
        'Content-Type' => 'application/xml'
    );

    // Disable Content-MD5 calculation for this operation
    $opt['NoContentMD5'] = true;

    if (is_string($parts))
    {
        // Assume it's the intended XML.
        $opt['body'] = $parts;
    }
    elseif ($parts instanceof SimpleXMLElement)
    {
        // Assume it's a SimpleXMLElement object representing the XML.
        $opt['body'] = $parts->asXML();
    }
    elseif (is_array($parts) || $parts instanceof CFResponse)
    {
        $xml = simplexml_load_string($this->complete_mpu_xml);

        if (is_array($parts))
        {
            // Generate the appropriate XML.
            foreach ($parts as $node)
            {
                $part = $xml->addChild('Part');
                $part->addChild('PartNumber', $node['PartNumber']);
                $part->addChild('ETag', $node['ETag']);
            }

        }
        elseif ($parts instanceof CFResponse)
        {
            // Assume it's a response from list_parts().
            foreach ($parts->body->Part as $node)
            {
                $part = $xml->addChild('Part');
                $part->addChild('PartNumber', (string) $node->PartNumber);
                $part->addChild('ETag', (string) $node->ETag);
            }
        }

        $opt['body'] = $xml->asXML();
    }

    // Authenticate to S3
    return $this->authenticate($bucket, $opt);
}

Copyright © 2010–2013 Amazon Web Services, LLC


Feedback