/**
  * Constructs the PostObject.
  *
  * @param S3ClientInterface $client     Client used with the POST object
  * @param string            $bucket     Bucket to use
  * @param array             $formInputs Associative array of form input
  *                                      fields.
  * @param string|array      $jsonPolicy JSON encoded POST policy document.
  *                                      The policy will be base64 encoded
  *                                      and applied to the form on your
  *                                      behalf.
  */
 public function __construct(S3ClientInterface $client, $bucket, array $formInputs, $jsonPolicy)
 {
     $this->client = $client;
     $this->bucket = $bucket;
     if (is_array($jsonPolicy)) {
         $jsonPolicy = json_encode($jsonPolicy);
     }
     $this->jsonPolicy = $jsonPolicy;
     $this->formAttributes = ['action' => $this->generateUri(), 'method' => 'POST', 'enctype' => 'multipart/form-data'];
     $this->formInputs = $formInputs + ['key' => '${filename}'];
     $credentials = $client->getCredentials()->wait();
     $this->formInputs += $this->getPolicyAndSignature($credentials);
 }
 /**
  * Creates an UploadState object for a multipart upload by querying the
  * service for the specified upload's information.
  *
  * @param S3ClientInterface $client   S3Client used for the upload.
  * @param string            $bucket   Bucket for the multipart upload.
  * @param string            $key      Object key for the multipart upload.
  * @param string            $uploadId Upload ID for the multipart upload.
  *
  * @return UploadState
  */
 public static function getStateFromService(S3ClientInterface $client, $bucket, $key, $uploadId)
 {
     $state = new UploadState(['Bucket' => $bucket, 'Key' => $key, 'UploadId' => $uploadId]);
     foreach ($client->getPaginator('ListParts', $state->getId()) as $result) {
         // Get the part size from the first part in the first result.
         if (!$state->getPartSize()) {
             $state->setPartSize($result->search('Parts[0].Size'));
         }
         // Mark all the parts returned by ListParts as uploaded.
         foreach ($result['Parts'] as $part) {
             $state->markPartAsUploaded($part['PartNumber'], ['PartNumber' => $part['PartNumber'], 'ETag' => $part['ETag']]);
         }
     }
     $state->setStatus(UploadState::INITIATED);
     return $state;
 }