【问题标题】:Upload a file to Azure Media Services asset via Javascript and PHP combo通过 Javascript 和 PHP 组合将文件上传到 Azure 媒体服务资产
【发布时间】:2016-03-28 11:03:44
【问题描述】:

我正在考虑让我的用户上传自己的视频文件。为此,我想使用 Azure 媒体服务。由于用户将直接从他们的设备上传到 Azure,唯一的途径似乎是使用共享访问签名。

As seen otherwise,常用流程为:

  1. 客户端通过 Web API 请求要上传到的 URL
  2. Web API 将通过 AMS SDK(即存储容器)创建资产
  3. Web API 将为该容器创建一个只写的 SAS URL
  4. Web API 将返回 SAS URL
  5. 客户端直接向该 URL 发出新请求

这一切看起来都不错,但大多数/所有这样做的例子都是在 C# 中,我需要它在 PHP 中。请求支持的official SDK closed the issue,开放一年的there's another one

我创建了一个 SAS 链接(使用 beberlei/azure-blob-storage

https://media[redacted].blob.core.windows.net/asset-adc73a5d-1500-80c5-173d-f1e5d00fd8b2?st=2016-02-10T15%3A58%3A44.0000000Z&se=2016-02-10T16%3A33%3A44.0000000Z&sr=c&sp=w&sig=O9p6jyAoYltWwUHughaC9g3mBacdBnZEbuBDahPfCFA%3D

但无论我做什么,我总是会收到一条消息:

签名不匹配。使用的签名字符串是 w 2016-02-10T15:58:44.0000000Z 2016-02-10T16:33:44.0000000Z /media[已编辑]/asset-adc73a5d-1500-80c5-173d-f1e5d00fd8b2

所以:

  1. 我对正确工作流程的理解是否正确?我是否先创建资产,然后在资产上创建一个 SAS 令牌,就好像它是一个普通的 blob 容器一样?
  2. 是否有最新的 PHP 库/SDK 可供我使用?

【问题讨论】:

    标签: javascript php azure azure-blob-storage azure-media-services


    【解决方案1】:

    当我输入这个问题时,我偶然发现了答案,希望它可以帮助其他人,所以我不会删除它。

    失败的原因是我使用我的媒体服务帐户名称/密钥来访问 AMS API 和生成 SAS。这是错误的。我需要:

    1. 使用 AMS 帐户/密钥创建资产
    2. 使用链接的存储帐户/密钥创建 SAS URL

    我在这里遇到了一个与 CORS 相关的错误,这似乎是朝着正确方向迈出的一步,如果失败将更新。

    编辑 1:它确实失败了。我需要将我的 API 调用版本更新为 2013-08-13 及更高版本,这改变了正确的 SAS 校验和生成。请注意the current official PHP SDK will only use storage version 2012-02-12,因此您将无法使用它启用 CORS。

    我的代码如下(它是超级混乱,因为我正在这样做作为原型):

    <?php
    use Beberlei\AzureBlobStorage\SharedAccessSignature;
    use WindowsAzure\Common\Internal\MediaServicesSettings;
    use WindowsAzure\Common\ServicesBuilder;
    use WindowsAzure\MediaServices\MediaServicesRestProxy;
    use WindowsAzure\MediaServices\Models\Asset;
    
    require 'vendor/autoload.php';
    
    $fileName = $_GET['blobName'];
    $accountName = '<AMS account>';
    $accessKey = '<AMS key>';
    $settings = new MediaServicesSettings($accountName, $accessKey);
    
    /** @var MediaServicesRestProxy $proxy */
    $proxy = ServicesBuilder::getInstance()->createMediaServicesService($settings);
    $asset = new Asset(Asset::OPTIONS_NONE);
    $asset->setName($fileName);
    
    /** @var Asset $asset */
    $asset = $proxy->createAsset($asset);
    $assetId = $asset->getId();
    $path = parse_url($asset->getUri(), PHP_URL_PATH);
    
    $startTime = new \DateTime('now -5 minutes');
    $expiryTime = new \DateTime('now +30 minutes');
    $signatureGenerator = new SharedAccessSignature('<storage account>', '<storage key>');
    $signature = $signatureGenerator->createSignedQueryString(
        $path,
        '',
        'c',
        'w',
        isoDate($startTime),
        isoDate($expiryTime)
    );
    
    die($asset->getUri().'?'.$signature);
    
    function isoDate(\DateTime $dateTime)
    {
        $tz = date_default_timezone_get();
        date_default_timezone_set('UTC');
        $returnValue = str_replace('+00:00', '.0000000Z', date('c', $dateTime->getTimestamp()));
        date_default_timezone_set($tz);
    
        return $returnValue;
    }
    

    【讨论】:

      【解决方案2】:

      如果您通过 JavaScript 上传视频文件,则需要在您的媒体服务帐户下的存储帐户上设置 CORS。请参阅此文档以在您的 Blob 存储上设置 CORS 设置(使您的站点能够写入存储):https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx。我相信有一些方便的工具可以让你在不编写代码的情况下也能做到这一点。

      【讨论】:

        猜你喜欢
        • 2015-07-21
        • 2018-01-30
        • 2013-10-24
        • 2016-12-30
        • 2015-04-12
        • 1970-01-01
        • 1970-01-01
        • 2015-05-20
        • 1970-01-01
        相关资源
        最近更新 更多