2679 lines
87 KiB
PHP
2679 lines
87 KiB
PHP
<?php
|
|
|
|
/**
|
|
* LICENSE: The MIT License (the "License")
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
* https://github.com/azure/azure-storage-php/LICENSE
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* PHP version 5
|
|
*
|
|
* @category Microsoft
|
|
* @package MicrosoftAzure\Storage\Blob
|
|
* @author Azure Storage PHP SDK <dmsh@microsoft.com>
|
|
* @copyright 2016 Microsoft Corporation
|
|
* @license https://github.com/azure/azure-storage-php/LICENSE
|
|
* @link https://github.com/azure/azure-storage-php
|
|
*/
|
|
|
|
namespace MicrosoftAzure\Storage\Blob;
|
|
|
|
use MicrosoftAzure\Storage\Common\Internal\HttpFormatter;
|
|
use MicrosoftAzure\Storage\Common\Internal\Utilities;
|
|
use MicrosoftAzure\Storage\Common\Internal\Resources;
|
|
use MicrosoftAzure\Storage\Common\Internal\Validate;
|
|
use MicrosoftAzure\Storage\Common\Models\ServiceProperties;
|
|
use MicrosoftAzure\Storage\Common\Internal\ServiceRestProxy;
|
|
use MicrosoftAzure\Storage\Blob\Internal\IBlob;
|
|
use MicrosoftAzure\Storage\Blob\Models\BlobServiceOptions;
|
|
use MicrosoftAzure\Storage\Common\Models\GetServicePropertiesResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListContainersOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListContainersResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateContainerOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetContainerPropertiesResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetContainerACLResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\SetContainerMetadataOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\DeleteContainerOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListBlobsOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListBlobsResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\BlobType;
|
|
use MicrosoftAzure\Storage\Blob\Models\Block;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateBlobOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\BlobProperties;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetBlobPropertiesOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetBlobPropertiesResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\SetBlobPropertiesOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\SetBlobPropertiesResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetBlobMetadataOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetBlobMetadataResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\SetBlobMetadataOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\SetBlobMetadataResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetBlobOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\GetBlobResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\DeleteBlobOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\LeaseMode;
|
|
use MicrosoftAzure\Storage\Blob\Models\AcquireLeaseOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\AcquireLeaseResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateBlobPagesOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateBlobPagesResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\PageWriteOption;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListPageBlobRangesOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListPageBlobRangesResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateBlobBlockOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\CommitBlobBlocksOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\BlockList;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListBlobBlocksOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\ListBlobBlocksResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\CopyBlobOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateBlobSnapshotOptions;
|
|
use MicrosoftAzure\Storage\Blob\Models\CreateBlobSnapshotResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\PageRange;
|
|
use MicrosoftAzure\Storage\Blob\Models\CopyBlobResult;
|
|
use MicrosoftAzure\Storage\Blob\Models\BreakLeaseResult;
|
|
use MicrosoftAzure\Storage\Common\Internal\ServiceFunctionThread;
|
|
use GuzzleHttp\Psr7;
|
|
|
|
/**
|
|
* This class constructs HTTP requests and receive HTTP responses for blob
|
|
* service layer.
|
|
*
|
|
* @category Microsoft
|
|
* @package MicrosoftAzure\Storage\Blob
|
|
* @author Azure Storage PHP SDK <dmsh@microsoft.com>
|
|
* @copyright 2016 Microsoft Corporation
|
|
* @license https://github.com/azure/azure-storage-php/LICENSE
|
|
* @version Release: 0.11.0
|
|
* @link https://github.com/azure/azure-storage-php
|
|
*/
|
|
class BlobRestProxy extends ServiceRestProxy implements IBlob
|
|
{
|
|
/**
|
|
* @var int Defaults to 32MB
|
|
*/
|
|
private $_SingleBlobUploadThresholdInBytes = Resources::MB_IN_BYTES_32;
|
|
|
|
/**
|
|
* Get the value for SingleBlobUploadThresholdInBytes
|
|
*
|
|
* @return int
|
|
*/
|
|
public function getSingleBlobUploadThresholdInBytes()
|
|
{
|
|
return $this->_SingleBlobUploadThresholdInBytes;
|
|
}
|
|
|
|
/**
|
|
* Set the value for SingleBlobUploadThresholdInBytes, Max 64MB
|
|
*
|
|
* @param int $val The max size to send as a single blob block
|
|
*
|
|
* @return none
|
|
*/
|
|
public function setSingleBlobUploadThresholdInBytes($val)
|
|
{
|
|
if ($val > Resources::MB_IN_BYTES_64) {
|
|
// What should the proper action here be?
|
|
$val = Resources::MB_IN_BYTES_64;
|
|
} elseif ($val < 1) {
|
|
// another spot that could use looking at
|
|
$val = Resources::MB_IN_BYTES_32;
|
|
}
|
|
$this->_SingleBlobUploadThresholdInBytes = $val;
|
|
}
|
|
|
|
/**
|
|
* Gets the copy blob source name with specified parameters.
|
|
*
|
|
* @param string $containerName The name of the container.
|
|
* @param string $blobName The name of the blob.
|
|
* @param Models\CopyBlobOptions $options The optional parameters.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function _getCopyBlobSourceName($containerName, $blobName, $options)
|
|
{
|
|
$sourceName = $this->_getBlobUrl($containerName, $blobName);
|
|
|
|
if (!is_null($options->getSourceSnapshot())) {
|
|
$sourceName .= '?snapshot=' . $options->getSourceSnapshot();
|
|
}
|
|
|
|
return $sourceName;
|
|
}
|
|
|
|
/**
|
|
* Creates URI path for blob.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param string $blob The blob name.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function _createPath($container, $blob)
|
|
{
|
|
$encodedBlob = urlencode($blob);
|
|
// Unencode the forward slashes to match what the server expects.
|
|
$encodedBlob = str_replace('%2F', '/', $encodedBlob);
|
|
// Unencode the backward slashes to match what the server expects.
|
|
$encodedBlob = str_replace('%5C', '/', $encodedBlob);
|
|
// Re-encode the spaces (encoded as space) to the % encoding.
|
|
$encodedBlob = str_replace('+', '%20', $encodedBlob);
|
|
|
|
// Empty container means accessing default container
|
|
if (empty($container)) {
|
|
return $encodedBlob;
|
|
} else {
|
|
return $container . '/' . $encodedBlob;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates full URI to the given blob.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param string $blob The blob name.
|
|
*
|
|
* @return string
|
|
*/
|
|
private function _getBlobUrl($container, $blob)
|
|
{
|
|
$encodedBlob = urlencode($blob);
|
|
// Unencode the forward slashes to match what the server expects.
|
|
$encodedBlob = str_replace('%2F', '/', $encodedBlob);
|
|
// Unencode the backward slashes to match what the server expects.
|
|
$encodedBlob = str_replace('%5C', '/', $encodedBlob);
|
|
// Re-encode the spaces (encoded as space) to the % encoding.
|
|
$encodedBlob = str_replace('+', '%20', $encodedBlob);
|
|
|
|
// Empty container means accessing default container
|
|
if (empty($container)) {
|
|
$encodedBlob = $encodedBlob;
|
|
} else {
|
|
$encodedBlob = $container . '/' . $encodedBlob;
|
|
}
|
|
|
|
if (substr($encodedBlob, 0, 1) != '/' && substr($this->getUri(), -1, 1) != '/') {
|
|
$encodedBlob = '/' . $encodedBlob;
|
|
}
|
|
return $this->getUri() . $encodedBlob;
|
|
}
|
|
|
|
/**
|
|
* Creates GetBlobPropertiesResult from headers array.
|
|
*
|
|
* @param array $headers The HTTP response headers array.
|
|
*
|
|
* @return GetBlobPropertiesResult
|
|
*/
|
|
private function _getBlobPropertiesResultFromResponse($headers)
|
|
{
|
|
$result = new GetBlobPropertiesResult();
|
|
$properties = new BlobProperties();
|
|
$d = $headers[Resources::LAST_MODIFIED];
|
|
$bType = $headers[Resources::X_MS_BLOB_TYPE];
|
|
$cLength = intval($headers[Resources::CONTENT_LENGTH]);
|
|
$lStatus = Utilities::tryGetValue($headers, Resources::X_MS_LEASE_STATUS);
|
|
$cType = Utilities::tryGetValue($headers, Resources::CONTENT_TYPE);
|
|
$cMD5 = Utilities::tryGetValue($headers, Resources::CONTENT_MD5);
|
|
$cEncoding = Utilities::tryGetValue($headers, Resources::CONTENT_ENCODING);
|
|
$cLanguage = Utilities::tryGetValue($headers, Resources::CONTENT_LANGUAGE);
|
|
$cControl = Utilities::tryGetValue($headers, Resources::CACHE_CONTROL);
|
|
$etag = $headers[Resources::ETAG];
|
|
$metadata = $this->getMetadataArray($headers);
|
|
|
|
if (array_key_exists(Resources::X_MS_BLOB_SEQUENCE_NUMBER, $headers)) {
|
|
$sNumber = intval($headers[Resources::X_MS_BLOB_SEQUENCE_NUMBER]);
|
|
$properties->setSequenceNumber($sNumber);
|
|
}
|
|
|
|
$properties->setBlobType($bType);
|
|
$properties->setCacheControl($cControl);
|
|
$properties->setContentEncoding($cEncoding);
|
|
$properties->setContentLanguage($cLanguage);
|
|
$properties->setContentLength($cLength);
|
|
$properties->setContentMD5($cMD5);
|
|
$properties->setContentType($cType);
|
|
$properties->setETag($etag);
|
|
$properties->setLastModified(Utilities::rfc1123ToDateTime($d));
|
|
$properties->setLeaseStatus($lStatus);
|
|
|
|
$result->setProperties($properties);
|
|
$result->setMetadata($metadata);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Helper method for getContainerProperties and getContainerMetadata.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param Models\BlobServiceOptions $options The optional parameters.
|
|
* @param string $operation The operation string. Should be
|
|
* 'metadata' to get metadata.
|
|
*
|
|
* @return Models\GetContainerPropertiesResult
|
|
*/
|
|
private function _getContainerPropertiesImpl(
|
|
$container,
|
|
$options = null,
|
|
$operation = null
|
|
) {
|
|
Validate::isString($container, 'container');
|
|
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new BlobServiceOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'container'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
$operation
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
$responseHeaders = HttpFormatter::formatHeaders($response->getHeaders());
|
|
|
|
$result = new GetContainerPropertiesResult();
|
|
$metadata = $this->getMetadataArray($responseHeaders);
|
|
$date = Utilities::tryGetValue($responseHeaders, Resources::LAST_MODIFIED);
|
|
$date = Utilities::rfc1123ToDateTime($date);
|
|
$result->setETag(Utilities::tryGetValue($responseHeaders, Resources::ETAG));
|
|
$result->setMetadata($metadata);
|
|
$result->setLastModified($date);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Adds optional create blob headers.
|
|
*
|
|
* @param CreateBlobOptions $options The optional parameters.
|
|
* @param array $headers The HTTP request headers.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function _addCreateBlobOptionalHeaders($options, $headers)
|
|
{
|
|
$contentType = $options->getContentType();
|
|
$metadata = $options->getMetadata();
|
|
$blobContentType = $options->getBlobContentType();
|
|
$blobContentEncoding = $options->getBlobContentEncoding();
|
|
$blobContentLanguage = $options->getBlobContentLanguage();
|
|
$blobContentMD5 = $options->getBlobContentMD5();
|
|
$blobCacheControl = $options->getBlobCacheControl();
|
|
$leaseId = $options->getLeaseId();
|
|
|
|
if (!is_null($contentType)) {
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
$options->getContentType()
|
|
);
|
|
} else {
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
Resources::BINARY_FILE_TYPE
|
|
);
|
|
}
|
|
$headers = $this->addMetadataHeaders($headers, $metadata);
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_ENCODING,
|
|
$options->getContentEncoding()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_LANGUAGE,
|
|
$options->getContentLanguage()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_MD5,
|
|
$options->getContentMD5()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CACHE_CONTROL,
|
|
$options->getCacheControl()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$leaseId
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_TYPE,
|
|
$blobContentType
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_ENCODING,
|
|
$blobContentEncoding
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_LANGUAGE,
|
|
$blobContentLanguage
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_MD5,
|
|
$blobContentMD5
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CACHE_CONTROL,
|
|
$blobCacheControl
|
|
);
|
|
|
|
return $headers;
|
|
}
|
|
|
|
/**
|
|
* Adds Range header to the headers array.
|
|
*
|
|
* @param array $headers The HTTP request headers.
|
|
* @param integer $start The start byte.
|
|
* @param integer $end The end byte.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function _addOptionalRangeHeader($headers, $start, $end)
|
|
{
|
|
if (!is_null($start) || !is_null($end)) {
|
|
$range = $start . '-' . $end;
|
|
$rangeValue = 'bytes=' . $range;
|
|
$this->addOptionalHeader($headers, Resources::RANGE, $rangeValue);
|
|
}
|
|
|
|
return $headers;
|
|
}
|
|
|
|
/**
|
|
* Does the actual work for leasing a blob.
|
|
*
|
|
* @param string $leaseAction The lease action string.
|
|
* @param string $container The container name.
|
|
* @param string $blob The blob to lease name.
|
|
* @param string $leaseId The existing lease id.
|
|
* @param BlobServiceOptions $options The optional parameters.
|
|
* @param AccessCondition $accessCondition The access conditions.
|
|
*
|
|
* @return array
|
|
*/
|
|
private function _putLeaseImpl(
|
|
$leaseAction,
|
|
$container,
|
|
$blob,
|
|
$leaseId,
|
|
$options,
|
|
$accessCondition = null
|
|
) {
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
Validate::isString($container, 'container');
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::EMPTY_STRING;
|
|
|
|
switch ($leaseAction) {
|
|
case LeaseMode::ACQUIRE_ACTION:
|
|
$this->addOptionalHeader($headers, Resources::X_MS_LEASE_DURATION, -1);
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
break;
|
|
case LeaseMode::RENEW_ACTION:
|
|
$statusCode = Resources::STATUS_OK;
|
|
break;
|
|
case LeaseMode::RELEASE_ACTION:
|
|
$statusCode = Resources::STATUS_OK;
|
|
break;
|
|
case LeaseMode::BREAK_ACTION:
|
|
$statusCode = Resources::STATUS_ACCEPTED;
|
|
break;
|
|
default:
|
|
throw new \Exception(Resources::NOT_IMPLEMENTED_MSG);
|
|
}
|
|
|
|
if (!is_null($options)) {
|
|
$options = new BlobServiceOptions();
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$accessCondition
|
|
);
|
|
|
|
$this->addOptionalHeader($headers, Resources::X_MS_LEASE_ID, $leaseId);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ACTION,
|
|
$leaseAction
|
|
);
|
|
$this->addOptionalQueryParam($queryParams, Resources::QP_COMP, 'lease');
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
return HttpFormatter::formatHeaders($response->getHeaders());
|
|
}
|
|
|
|
/**
|
|
* Does actual work for create and clear blob pages.
|
|
*
|
|
* @param string $action Either clear or create.
|
|
* @param string $container The container name.
|
|
* @param string $blob The blob name.
|
|
* @param PageRange $range The page ranges.
|
|
* @param string $content The content string.
|
|
* @param CreateBlobPagesOptions $options The optional parameters.
|
|
*
|
|
* @return CreateBlobPagesResult
|
|
*/
|
|
private function _updatePageBlobPagesImpl(
|
|
$action,
|
|
$container,
|
|
$blob,
|
|
$range,
|
|
$content,
|
|
$options = null
|
|
) {
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($content, 'content');
|
|
Validate::isTrue(
|
|
$range instanceof PageRange,
|
|
sprintf(
|
|
Resources::INVALID_PARAM_MSG,
|
|
'range',
|
|
get_class(new PageRange())
|
|
)
|
|
);
|
|
$body = Psr7\stream_for($content);
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new CreateBlobPagesOptions();
|
|
}
|
|
|
|
$headers = $this->_addOptionalRangeHeader(
|
|
$headers,
|
|
$range->getStart(),
|
|
$range->getEnd()
|
|
);
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_MD5,
|
|
$options->getContentMD5()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_PAGE_WRITE,
|
|
$action
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
Resources::URL_ENCODED_CONTENT_TYPE
|
|
);
|
|
$this->addOptionalQueryParam($queryParams, Resources::QP_COMP, 'page');
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
$body
|
|
);
|
|
|
|
return CreateBlobPagesResult::create(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Gets the properties of the Blob service.
|
|
*
|
|
* @param Models\BlobServiceOptions $options The optional parameters.
|
|
*
|
|
* @return MicrosoftAzure\Storage\Common\Models\GetServicePropertiesResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/hh452239.aspx
|
|
*/
|
|
public function getServiceProperties($options = null)
|
|
{
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$path = Resources::EMPTY_STRING;
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new BlobServiceOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'service'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'properties'
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
$parsed = $this->dataSerializer->unserialize($response->getBody());
|
|
|
|
return GetServicePropertiesResult::create($parsed);
|
|
}
|
|
|
|
/**
|
|
* Sets the properties of the Blob service.
|
|
*
|
|
* It's recommended to use getServiceProperties, alter the returned object and
|
|
* then use setServiceProperties with this altered object.
|
|
*
|
|
* @param ServiceProperties $serviceProperties The service properties.
|
|
* @param Models\BlobServiceOptions $options The optional parameters.
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/hh452235.aspx
|
|
*/
|
|
public function setServiceProperties($serviceProperties, $options = null)
|
|
{
|
|
Validate::isTrue(
|
|
$serviceProperties instanceof ServiceProperties,
|
|
Resources::INVALID_SVC_PROP_MSG
|
|
);
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$statusCode = Resources::STATUS_ACCEPTED;
|
|
$path = Resources::EMPTY_STRING;
|
|
$body = $serviceProperties->toXml($this->dataSerializer);
|
|
|
|
if (is_null($options)) {
|
|
$options = new BlobServiceOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'service'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'properties'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
Resources::URL_ENCODED_CONTENT_TYPE
|
|
);
|
|
|
|
$this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
$body
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Lists all of the containers in the given storage account.
|
|
*
|
|
* @param Models\ListContainersOptions $options The optional parameters.
|
|
*
|
|
* @return MicrosoftAzure\Storage\Blob\Models\ListContainersResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179352.aspx
|
|
*/
|
|
public function listContainers($options = null)
|
|
{
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$path = Resources::EMPTY_STRING;
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new ListContainersOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'list'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_PREFIX,
|
|
$options->getPrefix()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_MARKER,
|
|
$options->getMarker()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_MAX_RESULTS,
|
|
$options->getMaxResults()
|
|
);
|
|
$isInclude = $options->getIncludeMetadata();
|
|
$isInclude = $isInclude ? 'metadata' : null;
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_INCLUDE,
|
|
$isInclude
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
$parsed = $this->dataSerializer->unserialize($response->getBody());
|
|
|
|
return ListContainersResult::create($parsed);
|
|
}
|
|
|
|
/**
|
|
* Creates a new container in the given storage account.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param Models\CreateContainerOptions $options The optional parameters.
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179468.aspx
|
|
*/
|
|
public function createContainer($container, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::notNullOrEmpty($container, 'container');
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array(Resources::QP_REST_TYPE => 'container');
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new CreateContainerOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$metadata = $options->getMetadata();
|
|
$headers = $this->generateMetadataHeaders($metadata);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_PUBLIC_ACCESS,
|
|
$options->getPublicAccess()
|
|
);
|
|
|
|
$this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Creates a new container in the given storage account.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param Models\DeleteContainerOptions $options The optional parameters.
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179408.aspx
|
|
*/
|
|
public function deleteContainer($container, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::notNullOrEmpty($container, 'container');
|
|
|
|
$method = Resources::HTTP_DELETE;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_ACCEPTED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new DeleteContainerOptions();
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'container'
|
|
);
|
|
|
|
$this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Returns all properties and metadata on the container.
|
|
*
|
|
* @param string $container name
|
|
* @param Models\BlobServiceOptions $options optional parameters
|
|
*
|
|
* @return Models\GetContainerPropertiesResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179370.aspx
|
|
*/
|
|
public function getContainerProperties($container, $options = null)
|
|
{
|
|
return $this->_getContainerPropertiesImpl($container, $options);
|
|
}
|
|
|
|
/**
|
|
* Returns only user-defined metadata for the specified container.
|
|
*
|
|
* @param string $container name
|
|
* @param Models\BlobServiceOptions $options optional parameters
|
|
*
|
|
* @return Models\GetContainerPropertiesResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691976.aspx
|
|
*/
|
|
public function getContainerMetadata($container, $options = null)
|
|
{
|
|
return $this->_getContainerPropertiesImpl($container, $options, 'metadata');
|
|
}
|
|
|
|
/**
|
|
* Gets the access control list (ACL) and any container-level access policies
|
|
* for the container.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param Models\BlobServiceOptions $options The optional parameters.
|
|
*
|
|
* @return Models\GetContainerAclResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179469.aspx
|
|
*/
|
|
public function getContainerAcl($container, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new BlobServiceOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'container'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'acl'
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
$responseHeaders = HttpFormatter::formatHeaders($response->getHeaders());
|
|
|
|
$access = Utilities::tryGetValue($responseHeaders, Resources::X_MS_BLOB_PUBLIC_ACCESS);
|
|
$etag = Utilities::tryGetValue($responseHeaders, Resources::ETAG);
|
|
$modified = Utilities::tryGetValue($responseHeaders, Resources::LAST_MODIFIED);
|
|
$modifiedDate = Utilities::convertToDateTime($modified);
|
|
$parsed = $this->dataSerializer->unserialize($response->getBody());
|
|
|
|
return GetContainerAclResult::create($access, $etag, $modifiedDate, $parsed);
|
|
}
|
|
|
|
/**
|
|
* Sets the ACL and any container-level access policies for the container.
|
|
*
|
|
* @param string $container name
|
|
* @param Models\ContainerAcl $acl access control list for container
|
|
* @param Models\BlobServiceOptions $options optional parameters
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179391.aspx
|
|
*/
|
|
public function setContainerAcl($container, $acl, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::notNullOrEmpty($acl, 'acl');
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_OK;
|
|
$body = $acl->toXml($this->dataSerializer);
|
|
|
|
if (is_null($options)) {
|
|
$options = new BlobServiceOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'container'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'acl'
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_PUBLIC_ACCESS,
|
|
$acl->getPublicAccess()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
Resources::URL_ENCODED_CONTENT_TYPE
|
|
);
|
|
|
|
$this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
$body
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Sets metadata headers on the container.
|
|
*
|
|
* @param string $container name
|
|
* @param array $metadata metadata key/value pair.
|
|
* @param Models\SetContainerMetadataOptions $options optional parameters
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179362.aspx
|
|
*/
|
|
public function setContainerMetadata($container, $metadata, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
$this->validateMetadata($metadata);
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = $this->generateMetadataHeaders($metadata);
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new SetContainerMetadataOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'container'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'metadata'
|
|
);
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Lists all of the blobs in the given container.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param Models\ListBlobsOptions $options The optional parameters.
|
|
*
|
|
* @return Models\ListBlobsResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135734.aspx
|
|
*/
|
|
public function listBlobs($container, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $container;
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new ListBlobsOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_REST_TYPE,
|
|
'container'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'list'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_PREFIX,
|
|
str_replace('\\', '/', $options->getPrefix())
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_MARKER,
|
|
$options->getMarker()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_DELIMITER,
|
|
$options->getDelimiter()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_MAX_RESULTS,
|
|
$options->getMaxResults()
|
|
);
|
|
|
|
$includeMetadata = $options->getIncludeMetadata();
|
|
$includeSnapshots = $options->getIncludeSnapshots();
|
|
$includeUncommittedBlobs = $options->getIncludeUncommittedBlobs();
|
|
|
|
$includeValue = static::groupQueryValues(
|
|
array(
|
|
$includeMetadata ? 'metadata' : null,
|
|
$includeSnapshots ? 'snapshots' : null,
|
|
$includeUncommittedBlobs ? 'uncommittedblobs' : null
|
|
)
|
|
);
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_INCLUDE,
|
|
$includeValue
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
$parsed = $this->dataSerializer->unserialize($response->getBody());
|
|
|
|
return ListBlobsResult::create($parsed);
|
|
}
|
|
|
|
/**
|
|
* Creates a new page blob. Note that calling createPageBlob to create a page
|
|
* blob only initializes the blob.
|
|
* To add content to a page blob, call createBlobPages method.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param string $blob The blob name.
|
|
* @param integer $length Specifies the maximum size for the
|
|
* page blob, up to 1 TB. The page blob size must be aligned to a 512-byte
|
|
* boundary.
|
|
* @param Models\CreateBlobOptions $options The optional parameters.
|
|
*
|
|
* @return CopyBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx
|
|
*/
|
|
public function createPageBlob($container, $blob, $length, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
Validate::isInteger($length, 'length');
|
|
Validate::notNull($length, 'length');
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new CreateBlobOptions();
|
|
}
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_TYPE,
|
|
BlobType::PAGE_BLOB
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_LENGTH,
|
|
$length
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_SEQUENCE_NUMBER,
|
|
$options->getSequenceNumber()
|
|
);
|
|
$headers = $this->_addCreateBlobOptionalHeaders($options, $headers);
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
return CopyBlobResult::create(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Creates a new block blob or updates the content of an existing block blob.
|
|
*
|
|
* Updating an existing block blob overwrites any existing metadata on the blob.
|
|
* Partial updates are not supported with createBlockBlob the content of the
|
|
* existing blob is overwritten with the content of the new blob. To perform a
|
|
* partial update of the content of a block blob, use the createBlockList
|
|
* method.
|
|
* Note that the default content type is application/octet-stream.
|
|
*
|
|
* @param string $container The name of the container.
|
|
* @param string $blob The name of the blob.
|
|
* @param string|resource|StreamInterface $content The content of the blob.
|
|
* @param CreateBlobOptions $options The optional parameters.
|
|
*
|
|
* @return CopyBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179451.aspx
|
|
*/
|
|
public function createBlockBlob($container, $blob, $content, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
$body = Psr7\stream_for($content);
|
|
Validate::isTrue(
|
|
$options == null ||
|
|
$options instanceof CreateBlobOptions,
|
|
sprintf(
|
|
Resources::INVALID_PARAM_MSG,
|
|
'options',
|
|
get_class(new CreateBlobOptions())
|
|
)
|
|
);
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new CreateBlobOptions();
|
|
}
|
|
|
|
//If the size of the stream is not seekable or larger than the single
|
|
//upload threashold then call concurrent upload. Otherwise call putBlob.
|
|
if (!Utilities::isStreamLargerThanSizeOrNotSeekable(
|
|
$body,
|
|
$this->_SingleBlobUploadThresholdInBytes
|
|
)) {
|
|
$headers = $this->_addCreateBlobOptionalHeaders($options, $headers);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_TYPE,
|
|
BlobType::BLOCK_BLOB
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
$body
|
|
);
|
|
return CopyBlobResult::create(
|
|
HttpFormatter::formatHeaders($response->getHeaders())
|
|
);
|
|
} else {
|
|
// This is for large or failsafe upload
|
|
return $this->createBlockBlobConcurrent(
|
|
$container,
|
|
$blob,
|
|
$body,
|
|
$options
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clears a range of pages from the blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\PageRange $range Can be up to the value of
|
|
* the blob's full size.
|
|
* Note that ranges must be
|
|
* aligned to 512 (0-511,
|
|
* 512-1023)
|
|
* @param Models\CreateBlobPagesOptions $options optional parameters
|
|
*
|
|
* @return Models\CreateBlobPagesResult.
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691975.aspx
|
|
*/
|
|
public function clearBlobPages($container, $blob, $range, $options = null)
|
|
{
|
|
return $this->_updatePageBlobPagesImpl(
|
|
PageWriteOption::CLEAR_OPTION,
|
|
$container,
|
|
$blob,
|
|
$range,
|
|
Resources::EMPTY_STRING,
|
|
$options
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Creates a range of pages to a page blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\PageRange $range Can be up to 4 MB in
|
|
* size. Note that ranges
|
|
* must be aligned to 512
|
|
* (0-511, 512-1023)
|
|
* @param string|resource|StreamInterface $content the blob contents.
|
|
* @param Models\CreateBlobPagesOptions $options optional parameters
|
|
*
|
|
* @return Models\CreateBlobPagesResult.
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691975.aspx
|
|
*/
|
|
public function createBlobPages(
|
|
$container,
|
|
$blob,
|
|
$range,
|
|
$content,
|
|
$options = null
|
|
) {
|
|
$contentStream = Psr7\stream_for($content);
|
|
//because the content is at most 4MB long, can retrieve all the data
|
|
//here at once.
|
|
$body = $contentStream->getContents();
|
|
|
|
//if the range is not align to 512, throw exception.
|
|
$chunks = (int)($range->getLength() / 512);
|
|
if ($chunks * 512 != $range->getLength()) {
|
|
throw new \RuntimeException(Resources::ERROR_RANGE_NOT_ALIGN_TO_512);
|
|
}
|
|
|
|
return $this->_updatePageBlobPagesImpl(
|
|
PageWriteOption::UPDATE_OPTION,
|
|
$container,
|
|
$blob,
|
|
$range,
|
|
$body,
|
|
$options
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Creates a new block to be committed as part of a block blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param string $blockId must be less than or
|
|
* equal to 64 bytes in
|
|
* size. For a given blob,
|
|
* the length of the value
|
|
* specified for the
|
|
* blockid parameter must
|
|
* be the same size for
|
|
* each block.
|
|
* @param resource|string|StreamInterface $content the blob block contents
|
|
* @param Models\CreateBlobBlockOptions $options optional parameters
|
|
*
|
|
* @return \MicrosoftAzure\Storage\Blob\Models\CopyBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd135726.aspx
|
|
*/
|
|
public function createBlobBlock(
|
|
$container,
|
|
$blob,
|
|
$blockId,
|
|
$content,
|
|
$options = null
|
|
) {
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
Validate::isString($blockId, 'blockId');
|
|
Validate::notNullOrEmpty($blockId, 'blockId');
|
|
|
|
if (is_null($options)) {
|
|
$options = new CreateBlobBlockOptions();
|
|
}
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = $this->createBlobBlockHeader($options);
|
|
$postParams = array();
|
|
$queryParams = $this->createBlobBlockQueryParams($options, $blockId);
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
$contentStream = Psr7\stream_for($content);
|
|
$body = $contentStream->getContents();
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
$body
|
|
);
|
|
|
|
return CopyBlobResult::create(
|
|
HttpFormatter::formatHeaders($response->getHeaders())
|
|
);
|
|
}
|
|
|
|
/**
|
|
* create the header for createBlobBlock(s)
|
|
* @param array $options the option of the request
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function createBlobBlockHeader($options)
|
|
{
|
|
$headers = array();
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_MD5,
|
|
$options->getContentMD5()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
Resources::URL_ENCODED_CONTENT_TYPE
|
|
);
|
|
|
|
return $headers;
|
|
}
|
|
|
|
/**
|
|
* create the query params for createBlobBlock(s)
|
|
* @param array $options the option of the request
|
|
* @param string $blockId the block id of the block.
|
|
*
|
|
* @return array the constructed query parameters.
|
|
*/
|
|
protected function createBlobBlockQueryParams($options, $blockId)
|
|
{
|
|
$queryParams = array();
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'block'
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_BLOCKID,
|
|
$blockId
|
|
);
|
|
|
|
return $queryParams;
|
|
}
|
|
|
|
/**
|
|
* This method creates the blob blocks. This method will send the request
|
|
* concurrently for better performance.
|
|
*
|
|
* @param string $container The name of the container
|
|
* @param string $blob The name of the blob
|
|
* @param StreamInterface $content The stream that contains the content
|
|
* @param CreateBlobOptions $options The array that contains all the option
|
|
*
|
|
* @return \MicrosoftAzure\Storage\Blob\Models\CopyBlobResult
|
|
*/
|
|
protected function createBlockBlobConcurrent(
|
|
$container,
|
|
$blob,
|
|
$content,
|
|
$options = null
|
|
) {
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
$contentStream = Psr7\stream_for($content);
|
|
|
|
$createBlobBlockOptions = new CreateBlobBlockOptions();
|
|
if (is_null($options)) {
|
|
$options = new CreateBlobOptions();
|
|
}
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = $this->createBlobBlockHeader($createBlobBlockOptions);
|
|
$postParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
|
|
$blockIds = array();
|
|
// if threshold is lower than 4mb, honor threshold, else use 4mb
|
|
$blockSize = (
|
|
$this->_SingleBlobUploadThresholdInBytes
|
|
< Resources::MB_IN_BYTES_4) ?
|
|
$this->_SingleBlobUploadThresholdInBytes : Resources::MB_IN_BYTES_4;
|
|
$counter = 0;
|
|
//create the generator for requests.
|
|
//this generator also constructs the blockId array on the fly.
|
|
$generator = function () use (
|
|
$contentStream,
|
|
&$blockIds,
|
|
$blockSize,
|
|
$createBlobBlockOptions,
|
|
$method,
|
|
$headers,
|
|
$postParams,
|
|
$path,
|
|
&$counter
|
|
) {
|
|
//read the content.
|
|
$blockContent = $contentStream->read($blockSize);
|
|
//construct the blockId
|
|
$blockId = base64_encode(
|
|
str_pad($counter++, 6, '0', STR_PAD_LEFT)
|
|
);
|
|
$size = strlen($blockContent);
|
|
if ($size == 0) {
|
|
return null;
|
|
}
|
|
//add the id to array.
|
|
array_push($blockIds, new Block($blockId, 'Uncommitted'));
|
|
$queryParams = $this->createBlobBlockQueryParams(
|
|
$createBlobBlockOptions,
|
|
$blockId
|
|
);
|
|
//return the array of requests.
|
|
return $this->createRequest(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$blockContent
|
|
);
|
|
};
|
|
|
|
//add number of concurrency if specified int options.
|
|
$clientOptions = $options->getNumberOfConcurrency() == null?
|
|
array() : array($options->getNumberOfConcurrency);
|
|
|
|
//Send the request concurrently.
|
|
//Does not need to evaluate the results. If operation not successful,
|
|
//exception will be thrown.
|
|
$this->sendConcurrent(
|
|
array(),
|
|
$generator,
|
|
Resources::STATUS_CREATED,
|
|
$clientOptions
|
|
);
|
|
|
|
$response = $this->commitBlobBlocks(
|
|
$container,
|
|
$blob,
|
|
$blockIds,
|
|
$options
|
|
);
|
|
|
|
return CopyBlobResult::create(
|
|
HttpFormatter::formatHeaders(
|
|
$response->getHeaders()
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* This method writes a blob by specifying the list of block IDs that make up the
|
|
* blob. In order to be written as part of a blob, a block must have been
|
|
* successfully written to the server in a prior createBlobBlock method.
|
|
*
|
|
* You can call Put Block List to update a blob by uploading only those blocks
|
|
* that have changed, then committing the new and existing blocks together.
|
|
* You can do this by specifying whether to commit a block from the committed
|
|
* block list or from the uncommitted block list, or to commit the most recently
|
|
* uploaded version of the block, whichever list it may belong to.
|
|
*
|
|
* @param string $container The container name.
|
|
* @param string $blob The blob name.
|
|
* @param Models\BlockList|array $blockList The block entries.
|
|
* @param Models\CommitBlobBlocksOptions $options The optional parameters.
|
|
*
|
|
* @return CopyBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179467.aspx
|
|
*/
|
|
public function commitBlobBlocks($container, $blob, $blockList, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
Validate::isTrue(
|
|
$blockList instanceof BlockList || is_array($blockList),
|
|
sprintf(
|
|
Resources::INVALID_PARAM_MSG,
|
|
'blockList',
|
|
get_class(new BlockList())
|
|
)
|
|
);
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_CREATED;
|
|
$isArray = is_array($blockList);
|
|
$blockList = $isArray ? BlockList::create($blockList) : $blockList;
|
|
$body = $blockList->toXml($this->dataSerializer);
|
|
|
|
if (is_null($options)) {
|
|
$options = new CommitBlobBlocksOptions();
|
|
}
|
|
|
|
$blobContentType = $options->getBlobContentType();
|
|
$blobContentEncoding = $options->getBlobContentEncoding();
|
|
$blobContentLanguage = $options->getBlobContentLanguage();
|
|
$blobContentMD5 = $options->getBlobContentMD5();
|
|
$blobCacheControl = $options->getBlobCacheControl();
|
|
$leaseId = $options->getLeaseId();
|
|
$contentType = Resources::URL_ENCODED_CONTENT_TYPE;
|
|
|
|
$metadata = $options->getMetadata();
|
|
$headers = $this->generateMetadataHeaders($metadata);
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$leaseId
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CACHE_CONTROL,
|
|
$blobCacheControl
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_TYPE,
|
|
$blobContentType
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_ENCODING,
|
|
$blobContentEncoding
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_LANGUAGE,
|
|
$blobContentLanguage
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_MD5,
|
|
$blobContentMD5
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::CONTENT_TYPE,
|
|
$contentType
|
|
);
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'blocklist'
|
|
);
|
|
|
|
return $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
$body
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Retrieves the list of blocks that have been uploaded as part of a block blob.
|
|
*
|
|
* There are two block lists maintained for a blob:
|
|
* 1) Committed Block List: The list of blocks that have been successfully
|
|
* committed to a given blob with commitBlobBlocks.
|
|
* 2) Uncommitted Block List: The list of blocks that have been uploaded for a
|
|
* blob using Put Block (REST API), but that have not yet been committed.
|
|
* These blocks are stored in Windows Azure in association with a blob, but do
|
|
* not yet form part of the blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\ListBlobBlocksOptions $options optional parameters
|
|
*
|
|
* @return Models\ListBlobBlocksResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179400.aspx
|
|
*/
|
|
public function listBlobBlocks($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new ListBlobBlocksOptions();
|
|
}
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_BLOCK_LIST_TYPE,
|
|
$options->getBlockListType()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_SNAPSHOT,
|
|
$options->getSnapshot()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'blocklist'
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
$parsed = $this->dataSerializer->unserialize($response->getBody());
|
|
|
|
return ListBlobBlocksResult::create(HttpFormatter::formatHeaders($response->getHeaders()), $parsed);
|
|
}
|
|
|
|
/**
|
|
* Returns all properties and metadata on the blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\GetBlobPropertiesOptions $options optional parameters
|
|
*
|
|
* @return Models\GetBlobPropertiesResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179394.aspx
|
|
*/
|
|
public function getBlobProperties($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_HEAD;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new GetBlobPropertiesOptions();
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_SNAPSHOT,
|
|
$options->getSnapshot()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
$headers = $response->getHeaders();
|
|
$formattedHeaders = HttpFormatter::formatHeaders($headers);
|
|
|
|
return $this->_getBlobPropertiesResultFromResponse($formattedHeaders);
|
|
}
|
|
|
|
/**
|
|
* Returns all properties and metadata on the blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\GetBlobMetadataOptions $options optional parameters
|
|
*
|
|
* @return Models\GetBlobMetadataResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179350.aspx
|
|
*/
|
|
public function getBlobMetadata($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_HEAD;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new GetBlobMetadataOptions();
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_SNAPSHOT,
|
|
$options->getSnapshot()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'metadata'
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
$responseHeaders = HttpFormatter::formatHeaders($response->getHeaders());
|
|
$metadata = $this->getMetadataArray($responseHeaders);
|
|
|
|
return GetBlobMetadataResult::create($responseHeaders, $metadata);
|
|
}
|
|
|
|
/**
|
|
* Returns a list of active page ranges for a page blob. Active page ranges are
|
|
* those that have been populated with data.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\ListPageBlobRangesOptions $options optional parameters
|
|
*
|
|
* @return Models\ListPageBlobRangesResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691973.aspx
|
|
*/
|
|
public function listPageBlobRanges($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$queryParams = array();
|
|
$postParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new ListPageBlobRangesOptions();
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$headers = $this->_addOptionalRangeHeader(
|
|
$headers,
|
|
$options->getRangeStart(),
|
|
$options->getRangeEnd()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_SNAPSHOT,
|
|
$options->getSnapshot()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'pagelist'
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
$parsed = $this->dataSerializer->unserialize($response->getBody());
|
|
|
|
return ListPageBlobRangesResult::create(HttpFormatter::formatHeaders($response->getHeaders()), $parsed);
|
|
}
|
|
|
|
/**
|
|
* Sets system properties defined for a blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\SetBlobPropertiesOptions $options optional parameters
|
|
*
|
|
* @return Models\SetBlobPropertiesResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691966.aspx
|
|
*/
|
|
public function setBlobProperties($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new SetBlobPropertiesOptions();
|
|
}
|
|
|
|
$blobContentType = $options->getBlobContentType();
|
|
$blobContentEncoding = $options->getBlobContentEncoding();
|
|
$blobContentLanguage = $options->getBlobContentLanguage();
|
|
$blobContentLength = $options->getBlobContentLength();
|
|
$blobContentMD5 = $options->getBlobContentMD5();
|
|
$blobCacheControl = $options->getBlobCacheControl();
|
|
$leaseId = $options->getLeaseId();
|
|
$sNumberAction = $options->getSequenceNumberAction();
|
|
$sNumber = $options->getSequenceNumber();
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$leaseId
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CACHE_CONTROL,
|
|
$blobCacheControl
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_TYPE,
|
|
$blobContentType
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_ENCODING,
|
|
$blobContentEncoding
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_LANGUAGE,
|
|
$blobContentLanguage
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_LENGTH,
|
|
$blobContentLength
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_CONTENT_MD5,
|
|
$blobContentMD5
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_SEQUENCE_NUMBER_ACTION,
|
|
$sNumberAction
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_BLOB_SEQUENCE_NUMBER,
|
|
$sNumber
|
|
);
|
|
|
|
$this->addOptionalQueryParam($queryParams, Resources::QP_COMP, 'properties');
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
return SetBlobPropertiesResult::create(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Sets metadata headers on the blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param array $metadata key/value pair representation
|
|
* @param Models\SetBlobMetadataOptions $options optional parameters
|
|
*
|
|
* @return Models\SetBlobMetadataResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179414.aspx
|
|
*/
|
|
public function setBlobMetadata($container, $blob, $metadata, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
$this->validateMetadata($metadata);
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_OK;
|
|
|
|
if (is_null($options)) {
|
|
$options = new SetBlobMetadataOptions();
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
$headers = $this->addMetadataHeaders($headers, $metadata);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_COMP,
|
|
'metadata'
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
|
|
return SetBlobMetadataResult::create(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Downloads a blob to a file, the result contains its metadata and
|
|
* properties. The result will not contain a stream pointing to the
|
|
* content of the file.
|
|
*
|
|
* @param string $path The path and name of the file
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\GetBlobOptions $options optional parameters
|
|
*
|
|
* @return Models\GetBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179440.aspx
|
|
*/
|
|
public function saveBlobToFile($path, $container, $blob, $options = null)
|
|
{
|
|
|
|
$resource = fopen($path, 'w+');
|
|
if ($resource == null) {
|
|
throw new \Exception(Resources::ERROR_FILE_COULD_NOT_BE_OPENED);
|
|
}
|
|
|
|
$result = $this->getBlob($container, $blob, $options);
|
|
|
|
$content = $result->getContentStream();
|
|
|
|
while (!feof($content)) {
|
|
fwrite($resource, stream_get_contents($content, Resources::MB_IN_BYTES_4));
|
|
}
|
|
//response body has already been set to file. Set the stream of the
|
|
//response body to be null, then close the file.
|
|
$result->setContentStream(null);
|
|
fclose($resource);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Reads or downloads a blob from the system, including its metadata and
|
|
* properties.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\GetBlobOptions $options optional parameters
|
|
*
|
|
* @return Models\GetBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179440.aspx
|
|
*/
|
|
public function getBlob($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_GET;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = array(
|
|
Resources::STATUS_OK,
|
|
Resources::STATUS_PARTIAL_CONTENT
|
|
);
|
|
|
|
if (is_null($options)) {
|
|
$options = new GetBlobOptions();
|
|
}
|
|
|
|
$getMD5 = $options->getComputeRangeMD5();
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
$headers = $this->_addOptionalRangeHeader(
|
|
$headers,
|
|
$options->getRangeStart(),
|
|
$options->getRangeEnd()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_RANGE_GET_CONTENT_MD5,
|
|
$getMD5 ? 'true' : null
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_SNAPSHOT,
|
|
$options->getSnapshot()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode,
|
|
Resources::EMPTY_STRING,
|
|
['stream' => true] //setting stream to true to enable streaming
|
|
);
|
|
|
|
$metadata = $this->getMetadataArray(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
|
|
return GetBlobResult::create(
|
|
HttpFormatter::formatHeaders($response->getHeaders()),
|
|
$response->getBody(),
|
|
$metadata
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Deletes a blob or blob snapshot.
|
|
*
|
|
* Note that if the snapshot entry is specified in the $options then only this
|
|
* blob snapshot is deleted. To delete all blob snapshots, do not set Snapshot
|
|
* and just set getDeleteSnaphotsOnly to true.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\DeleteBlobOptions $options optional parameters
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd179413.aspx
|
|
*/
|
|
public function deleteBlob($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_DELETE;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$statusCode = Resources::STATUS_ACCEPTED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new DeleteBlobOptions();
|
|
}
|
|
|
|
if (is_null($options->getSnapshot())) {
|
|
$delSnapshots = $options->getDeleteSnaphotsOnly() ? 'only' : 'include';
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_DELETE_SNAPSHOTS,
|
|
$delSnapshots
|
|
);
|
|
} else {
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_SNAPSHOT,
|
|
$options->getSnapshot()
|
|
);
|
|
}
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$statusCode
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Creates a snapshot of a blob.
|
|
*
|
|
* @param string $container The name of the container.
|
|
* @param string $blob The name of the blob.
|
|
* @param Models\CreateBlobSnapshotOptions $options The optional parameters.
|
|
*
|
|
* @return Models\CreateBlobSnapshotResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691971.aspx
|
|
*/
|
|
public function createBlobSnapshot($container, $blob, $options = null)
|
|
{
|
|
Validate::isString($container, 'container');
|
|
Validate::isString($blob, 'blob');
|
|
Validate::notNullOrEmpty($blob, 'blob');
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$path = $this->_createPath($container, $blob);
|
|
$expectedStatusCode = Resources::STATUS_CREATED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new CreateBlobSnapshotOptions();
|
|
}
|
|
|
|
$queryParams[Resources::QP_COMP] = 'snapshot';
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
$headers = $this->addMetadataHeaders($headers, $options->getMetadata());
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$path,
|
|
$expectedStatusCode
|
|
);
|
|
|
|
return CreateBlobSnapshotResult::create(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Copies a source blob to a destination blob within the same storage account.
|
|
*
|
|
* @param string $destinationContainer name of the destination
|
|
* container
|
|
* @param string $destinationBlob name of the destination
|
|
* blob
|
|
* @param string $sourceContainer name of the source
|
|
* container
|
|
* @param string $sourceBlob name of the source
|
|
* blob
|
|
* @param Models\CopyBlobOptions $options optional parameters
|
|
*
|
|
* @return CopyBlobResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/dd894037.aspx
|
|
*/
|
|
public function copyBlob(
|
|
$destinationContainer,
|
|
$destinationBlob,
|
|
$sourceContainer,
|
|
$sourceBlob,
|
|
$options = null
|
|
) {
|
|
|
|
$method = Resources::HTTP_PUT;
|
|
$headers = array();
|
|
$postParams = array();
|
|
$queryParams = array();
|
|
$destinationBlobPath = $this->_createPath(
|
|
$destinationContainer,
|
|
$destinationBlob
|
|
);
|
|
$statusCode = Resources::STATUS_ACCEPTED;
|
|
|
|
if (is_null($options)) {
|
|
$options = new CopyBlobOptions();
|
|
}
|
|
|
|
$this->addOptionalQueryParam(
|
|
$queryParams,
|
|
Resources::QP_TIMEOUT,
|
|
$options->getTimeout()
|
|
);
|
|
|
|
$sourceBlobPath = $this->_getCopyBlobSourceName(
|
|
$sourceContainer,
|
|
$sourceBlob,
|
|
$options
|
|
);
|
|
|
|
$headers = $this->addOptionalAccessConditionHeader(
|
|
$headers,
|
|
$options->getAccessCondition()
|
|
);
|
|
|
|
$headers = $this->addOptionalSourceAccessConditionHeader(
|
|
$headers,
|
|
$options->getSourceAccessCondition()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_COPY_SOURCE,
|
|
$sourceBlobPath
|
|
);
|
|
|
|
$headers = $this->addMetadataHeaders($headers, $options->getMetadata());
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_LEASE_ID,
|
|
$options->getLeaseId()
|
|
);
|
|
|
|
$this->addOptionalHeader(
|
|
$headers,
|
|
Resources::X_MS_SOURCE_LEASE_ID,
|
|
$options->getSourceLeaseId()
|
|
);
|
|
|
|
$response = $this->send(
|
|
$method,
|
|
$headers,
|
|
$queryParams,
|
|
$postParams,
|
|
$destinationBlobPath,
|
|
$statusCode
|
|
);
|
|
|
|
return CopyBlobResult::create(HttpFormatter::formatHeaders($response->getHeaders()));
|
|
}
|
|
|
|
/**
|
|
* Establishes an exclusive one-minute write lock on a blob. To write to a locked
|
|
* blob, a client must provide a lease ID.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\AcquireLeaseOptions $options optional parameters
|
|
*
|
|
* @return Models\AcquireLeaseResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx
|
|
*/
|
|
public function acquireLease($container, $blob, $options = null)
|
|
{
|
|
$headers = $this->_putLeaseImpl(
|
|
LeaseMode::ACQUIRE_ACTION,
|
|
$container,
|
|
$blob,
|
|
null /* leaseId */,
|
|
is_null($options) ? new AcquireLeaseOptions() : $options,
|
|
is_null($options) ? null : $options->getAccessCondition()
|
|
);
|
|
|
|
return AcquireLeaseResult::create($headers);
|
|
}
|
|
|
|
/**
|
|
* Renews an existing lease
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param string $leaseId lease id when acquiring
|
|
* @param Models\BlobServiceOptions $options optional parameters
|
|
*
|
|
* @return Models\AcquireLeaseResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx
|
|
*/
|
|
public function renewLease($container, $blob, $leaseId, $options = null)
|
|
{
|
|
$headers = $this->_putLeaseImpl(
|
|
LeaseMode::RENEW_ACTION,
|
|
$container,
|
|
$blob,
|
|
$leaseId,
|
|
is_null($options) ? new BlobServiceOptions() : $options
|
|
);
|
|
|
|
return AcquireLeaseResult::create($headers);
|
|
}
|
|
|
|
/**
|
|
* Frees the lease if it is no longer needed so that another client may
|
|
* immediately acquire a lease against the blob.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param string $leaseId lease id when acquiring
|
|
* @param Models\BlobServiceOptions $options optional parameters
|
|
*
|
|
* @return none
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx
|
|
*/
|
|
public function releaseLease($container, $blob, $leaseId, $options = null)
|
|
{
|
|
$this->_putLeaseImpl(
|
|
LeaseMode::RELEASE_ACTION,
|
|
$container,
|
|
$blob,
|
|
$leaseId,
|
|
is_null($options) ? new BlobServiceOptions() : $options
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Ends the lease but ensure that another client cannot acquire a new lease until
|
|
* the current lease period has expired.
|
|
*
|
|
* @param string $container name of the container
|
|
* @param string $blob name of the blob
|
|
* @param Models\BlobServiceOptions $options optional parameters
|
|
*
|
|
* @return BreakLeaseResult
|
|
*
|
|
* @see http://msdn.microsoft.com/en-us/library/windowsazure/ee691972.aspx
|
|
*/
|
|
public function breakLease($container, $blob, $options = null)
|
|
{
|
|
$headers = $this->_putLeaseImpl(
|
|
LeaseMode::BREAK_ACTION,
|
|
$container,
|
|
$blob,
|
|
null,
|
|
is_null($options) ? new BlobServiceOptions() : $options
|
|
);
|
|
|
|
return BreakLeaseResult::create($headers);
|
|
}
|
|
}
|