我可以通过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;
思想?
答案 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');
这将生成与上述模式相同的链接。