通过Javascript和PHP组合将文件上载到Azure Media Services资产
我正在考虑让我的用户能够上传自己的视频文件。为此,我想使用Azure媒体服务。由于用户将直接从他们的设备上传到Azure,唯一的途径似乎是使用共享访问签名 ,常见的流程是:通过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编写。该项目要求提供支持,该
当我输入这个问题时,我看到了答案,希望它能帮助其他人,这样我就不会删除它 失败的原因是,我使用媒体服务帐户名/密钥访问AMS API和生成SAS。这是错误的。我需要:
如果要通过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;
}