0

Я ищу, чтобы мои пользователи могли загружать собственные видеофайлы. Для этого я хотел бы использовать Azure Media Services. Поскольку пользователи будут загружать непосредственно со своего устройства на Azure, единственным способом, по-видимому, является использование подписей общего доступа.Загрузите файл в Azure Media Services через Javascript и PHP combo

As seen otherwise, общий поток:

  1. клиент запрашивает URL, чтобы загрузить на через веб-API
  2. веб-API будет создать актив с помощью AMS SDK (который является контейнером для хранения)
  3. веб-API создаст URL-адрес только для записи для этого контейнера
  4. веб-API вернет URL-адрес SAS
  5. клиент выполняет новый запрос непосредственно по этому адресу

Это все кажется хорошим, но большинство/все примеры этого в 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

, но все, что я делаю, я всегда получаю сообщение об ошибке:

Подпись не совпадение. Строка знак был использован ш 2016-02-10T15: 58: 44.0000000Z 2016-02-10T16: 33: 44.0000000Z /СМИ [отредактированный]/актив-adc73a5d-1500-80c5-173d-f1e5d00fd8b2

So:

  1. Мое понимание правильного рабочего процесса здесь правильно? Сначала я создаю актив, а затем создаю токен SAS для актива, как если бы он был простым контейнером blob?
  2. есть ли обновленная библиотека PHP/SDK, которую я могу использовать для этого?

ответ

2

Как я набрал этот вопрос, я наткнулся на ответ, надеюсь, что он поможет кому-то другому, поэтому я не буду его удалять.

Причина, по которой это не удалось, поскольку я использовал имя/ключ учетной записи службы мультимедиа для доступа к API AMS и для генерации SAS. Это не верно. Мне нужно было:

  1. использования AMS счет/ключа для создания актива
  2. использования счета связанно хранение/ключа для создания URL SAS

я получаю ошибку 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; 
} 
1

Если вы uploding видеофайл с помощью JavaScript, вам необходимо установить CORS на счет хранения под учетной записью медиа-служб. Пожалуйста, обратитесь к этой документации, чтобы установить настройку CORS на вашем блочном хранилище (включите ваш сайт для записи на хранение): https://msdn.microsoft.com/en-us/library/azure/dn535601.aspx. Я считаю, что есть некоторые удобные инструменты, которые позволяют вам и без написания кода.