【问题标题】:Getting the url of a Blob just uploaded to Azure storage via PHP获取刚刚通过 PHP 上传到 Azure 存储的 Blob 的 url
【发布时间】:2015-02-12 22:39:58
【问题描述】:

像这样通过 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 />";
}

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

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

想法?

【问题讨论】:

  • 你使用的库在哪里?

标签: php azure azure-blob-storage


【解决方案1】:

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 名称作为 prefixoptions 参数中传递给此操作。您将在结果中仅获得一个 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 />";
    }

【讨论】:

  • 谢谢。这样做是为了以编程方式获取它:foreach($blobs as $blob) { if($blob-&gt;getName() === $blob_name) { $returnUrl = $blob-&gt;getUrl(); } } 它可以工作,但后来意识到模式总是相同的,所以我只是硬编码是用文件名作为变量
【解决方案2】:
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;
}

【讨论】:

    【解决方案3】:

    相当老的问题,但有更多最新的解决方案。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-24
      • 2014-11-26
      • 2016-02-13
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多