Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Javascript和PHP组合将文件上载到Azure Media Services资产_Javascript_Php_Azure_Azure Storage Blobs_Azure Media Services - Fatal编程技术网

通过Javascript和PHP组合将文件上载到Azure Media Services资产

通过Javascript和PHP组合将文件上载到Azure Media Services资产,javascript,php,azure,azure-storage-blobs,azure-media-services,Javascript,Php,Azure,Azure Storage Blobs,Azure Media Services,我正在考虑让我的用户能够上传自己的视频文件。为此,我想使用Azure媒体服务。由于用户将直接从他们的设备上传到Azure,唯一的途径似乎是使用共享访问签名 ,常见的流程是: 客户端通过web API请求要上载到的URL web API将通过AMS SDK(存储容器)创建资产 web API将为该容器创建一个只写SAS URL web API将返回SAS URL 客户端直接向该URL发出新请求 这一切似乎都很好,但大多数/所有这样做的例子都是用C#编写的,我需要用PHP编写。该项目要求提供支持,该

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

,常见的流程是:

  • 客户端通过web API请求要上载到的URL
  • web API将通过AMS SDK(存储容器)创建资产
  • web API将为该容器创建一个只写SAS URL
  • web API将返回SAS URL
  • 客户端直接向该URL发出新请求
  • 这一切似乎都很好,但大多数/所有这样做的例子都是用C#编写的,我需要用PHP编写。该项目要求提供支持,该项目开放一年

    我已创建SAS链接(使用)

    但无论我做什么,我总是得到一个信息:

    签名不匹配。使用的签名字符串为w 2016-02-10T15:58:44.0000000Z 2016-02-10T16:33:44.0000000Z /介质[修订]/asset-adc73a5d-1500-80c5-173d-f1e5d00fd8b2

    因此:

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

  • 当我输入这个问题时,我看到了答案,希望它能帮助其他人,这样我就不会删除它

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

  • 使用AMS帐户/密钥创建资产
  • 使用链接存储帐户/密钥创建SAS URL
  • 我在这里得到了一个与CORS相关的错误,这似乎是朝着正确方向迈出的一步,如果失败,将进行更新

    编辑1:它实际上失败了。我需要将API调用版本更新到2013-08-13及更高版本,这改变了正确的SAS校验和生成。请注意,这样您将无法使用它启用CORS

    我的代码如下所示(作为一个原型,它非常混乱):


    如果要通过JavaScript上传视频文件,则需要在媒体服务帐户下的存储帐户上设置CORS。请参阅本文档以设置blob存储上的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;
    }