Как загрузить поток в службы мультимедиа Azure
мы используем ASP.NET MVC 4 позволяет пользователям загружать видео и аудио через наш веб-сайт. Я хотел бы использовать Azure Media Service в качестве серверной части для этого.
, а после учебник Azure, проблема, с которой я столкнулся, заключается в том, что пакет SDK Azure Media Services не позволяет загружать необработанный поток данных. Вместо этого единственный метод загрузки, который я мог найти, использует аргумент строки пути.
Я хотел бы избежать сохранения файла на диск (он уже потоковым на диск по умолчанию) и иметь возможность передавать отправленный файл запроса прямо в Azure.
вот мой код до сих пор:
public void SaveMedia(string fileName, System.IO.Stream stream)
{
CloudMediaContext mediaCloud = new CloudMediaContext("account", "key");
AssetCreationOptions assetOptions = new AssetCreationOptions();
var asset = mediaCloud.Assets.Create(fileName, assetOptions);
var assetFile = asset.AssetFiles.Create(fileName);
var accessPolicy = mediaCloud.AccessPolicies.Create(fileName, TimeSpan.FromDays(3), AccessPermissions.Write | AccessPermissions.List);
var locator = mediaCloud.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);
assetFile.Upload("????????????");
locator.Delete();
accessPolicy.Delete();
}
Как это осуществить? Будет ли это противоречить любым "лучшим практикам" для обработки загрузок с использованием ASP.NET MVC 4 и Службы мультимедиа Azure?
1 ответов
вы не должны использовать службы мультимедиа Azure для загрузки, они не предназначены для входящего потока в Azure storage blob, который вы описываете.
используйте Azure Storage SDK напрямую (используйте v1.7, чтобы избежать проблем с перемоткой). SDK для хранения позволяет потоковой записи в blob. Для этого вам нужно сначала получить локатор записи SAS (похоже, что вы там), а затем использовать локатор.Путь.Сегменты для поиска контейнера активов. Затем используйте это для загрузки напрямую, используя CloubBlobClient в SDK хранения -- он предлагает функцию записи потока где-то.
Примечание. в ваш код выше: вы не указываете AssetCreationOptions.Нет, поэтому предполагается, что файлы в хранилище будут зашифрованы (механизм передачи по умолчанию является безопасным, а не необеспеченным). Я не думаю, что вы собираетесь выполнять шифрование хранилища в своем файловом потоке до загрузки, поэтому вам лучше установить это в AssetCreationOptions.Никто.
лично я бы не пошла этот маршрут. Читайте мой пост в блоге "создайте свой собственный youtube": http://blog-ndrouin.azurewebsites.net/?p=1471
в нем есть полный пример загруженного клиентом контента с использованием url-адреса SAS, предоставленного на стороне сервера (у которого есть учетные данные вашей учетной записи, которые вы, вероятно, не хотите плавать на стороне клиента!).
клиент, однако, должен иметь возможность сделать PUT в хранилище, используя этот URL SAS. В моем случае я использовал приложение командной строки C#. Вы будете невозможно сделать это в HTML5, если ваша веб-страница не размещена в том же домене, что и учетная запись целевого хранилища. Если ваша веб-страница (или I-фрейм, который управляет загрузками) не находится в том же домене, что и ваша учетная запись хранения, это вызовет вызов CORS "OPTIONS" в HTML5 для уровня REST хранилища Azure, который еще не поддерживает CORS.
альтернативы HTML5 I-Frame, размещенные в вашей учетной записи хранения, являются: sliverlight или flash upload shims с междоменным файлом в $ root вашего учетная запись хранения (или, возможно, те объекты плагина, размещенные в вашей учетной записи хранения, чтобы избежать запроса междоменного файла).
Я бы не рекомендовал загружать filestream на сервер в сообщении. Это делает ваш веб-сервис узким местом для всех входящих файлов; и длинный пост не особенно стабилен: ваш пул приложений может быть переработан в середине загрузки, и вы тосты.
PS. Наша команда (Службы Windows Azure Media Services) в основном отслеживает это форум:
http://social.msdn.microsoft.com/Forums/en-US/MediaServices/threads