获取Blob的URL只是通过PHP上传到Azure存储

时间:2014-12-14 20:36:17

标签: php azure azure-storage-blobs

我可以通过PHP将blob上传到Azure,没有问题:

 $blobRestProxy->createBlockBlob("saskcontainer", $blob_name, $content);

但我无法获取新创建的blob的URL。获取网址时,api非常直接。

 echo $blob->getUrl()

当我列出容器的内容时​​,它可以获得每个文件的url没有这样的问题:

$blob_list = $blobRestProxy->listBlobs("saskcontainer");
$blobs = $blob_list->getBlobs();

foreach($blobs as $blob)
{
    echo $blob->getUrl()."<br />";
}

很好,但我只想要一个网址(已上传的网址),但下面的代码不起作用:

$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;

思想?

3 个答案:

答案 0 :(得分:0)

blob的URL遵循以下模式:

[http|https]://[account-name].[endpoint-suffix(usually blob.core.windows.net]/[container-name]/[blob-name]

使用此模式,您可以构建blob的URL,而无需以编程方式获取它。

我查找了Azure SDK for PHP,我找不到以编程方式获取blob URL的简单方法(但后来我可能错了)。以编程方式获取URL的一种令人费解的方法是调用listBlobs方法,并在prefix参数中将blob名称作为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 />";
    }

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

很老的问题,但是还有更多最新的解决方案。

您可以像使用AWS一样使用Storage类检索URL。

$link = Storage::disk('azure')->url('your_filepath');

这将生成与上述模式相同的链接。