我像这样通过PHP将blob上传到Azure没问题:
$blobRestProxy->createBlockBlob("saskcontainer", $blob_name, $content);
但是我无法获取新创建的Blob的URL。该API非常简单,可以获取URL
echo $blob->getUrl()
当我列出容器的内容时,它可以获取每个文件的URL,像这样没有问题:
$blob_list = $blobRestProxy->listBlobs("saskcontainer");
$blobs = $blob_list->getBlobs();
foreach($blobs as $blob)
{
echo $blob->getUrl()."<br />";
}
很好,但是我只想要一个(上传的URL中的一个)URL,但是下面的代码不起作用:
$blob = $blobRestProxy->getBlob("saskcontainer", $blob_name);
echo $blob->getUrl();
我收到错误:调用未定义的方法WindowsAzure \ Blob \ Models \ GetBlobResult :: getUrl()
我也尝试过这个:
$blob = $blobRestProxy->getUrl("saskcontainer", $blob_name);
echo $blob;
错误:调用未定义的方法WindowsAzure \ Blob \ BlobRestProxy :: getUrl()库:
require_once 'WindowsAzure\WindowsAzure.php';
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
想法?
blob的URL遵循以下模式:
[http|https]://[account-name].[endpoint-suffix(usually blob.core.windows.net]/[container-name]/[blob-name]
使用此模式,您可以构建Blob的URL,而无需通过编程获取它。
我查找了适用于PHP的Azure SDK,但找不到用于以编程方式获取Blob URL的简单方法(但后来我可能是错的)。以编程方式获取URL的一种复杂方法是调用listBlobs
方法,并将该Blob名称作为prefix
传递给此操作的options
参数。您只会在结果中得到一个Blob,然后可以执行以下操作以获取Blob URL:
$listBlobsOptions = new ListBlobsOptions();
$listBlobsOptions->setPrefix($blobName);
$blob_list = $blobRestProxy->listBlobs($containerName, $listBlobsOptions);
$blobs = $blob_list->getBlobs();
foreach($blobs as $blob)
{
echo $blob->getUrl()."<br />";
}
public function getBlobUrl($accountName, $container, $blob, $resourceType, $permissions, $start, $expiry, $_signature) {
/* Create the signed query part */
$_parts = array();
$_parts[] = 'sv=2015-04-05';
$_parts[] = 'sr=' . $resourceType;
$_parts[] = 'sig=' . urlencode($_signature);
$_parts[] = (!empty($start)) ? 'st=' . urlencode($start) : '';
$_parts[] = (!empty($expiry)) ? 'se=' . urlencode($expiry) : '';
$_parts[] = (!empty($permissions)) ? 'sp=' . $permissions : '';
/* Create the signed blob URL */
if ($accountName == 'devstoreaccount1') {
$_url = 'http://127.0.0.1:10000/'
. $accountName . '/'
. $container . '/'
. $blob . '?'
. implode('&', $_parts);
} else {
$_url = 'https://'
. $accountName . '.blob.core.windows.net/'
. $container . '/'
. $blob . '?'
. implode('&', $_parts);
}
return $_url;
}