2013-02-20 31 views
7

Chúng tôi đang sử dụng ASP.NET MVC 4 để cho phép người dùng tải lên video và âm thanh thông qua trang web của chúng tôi. Tôi muốn sử dụng Azure Media Service làm back-end cho việc này.Cách tải luồng lên Azure Media Services

Trong khi theo dõi Azure's tutorial, vấn đề tôi đã gặp phải là Azure Media Services SDK dường như không cho phép tải lên luồng dữ liệu thô. Thay vào đó, phương thức tải lên duy nhất tôi có thể tìm thấy sử dụng đối số chuỗi đường dẫn.

Tôi muốn tránh lưu tệp vào đĩa (it's already streamed to disk by default) và có thể truyền tệp yêu cầu được đăng thông qua Azure.

Đây là mã của tôi vậy, đến nay:

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(); 
} 

Làm sao người ta thực hiện điều này? Điều này có xung đột với bất kỳ "phương pháp hay nhất" nào để xử lý tải lên bằng ASP.NET MVC 4 và Azure Media Services không?

Trả lời

10

Bạn không nên sử dụng Dịch vụ phương tiện Azure để tải lên, nó không được thiết kế cho inbound-stream-to-azure-storage-blob, đó là những gì bạn mô tả.

Sử dụng Azure Storage SDK trực tiếp (sử dụng v1.7 để tránh các sự cố khôi phục). SDK lưu trữ cho phép ghi luồng thành blob. Để làm điều này, trước tiên bạn cần có một bộ định vị SAS (trông giống như bạn đang ở đó), sau đó sử dụng locator.Path.Segments để tìm vùng chứa nội dung. Sau đó sử dụng để tải lên trực tiếp bằng cách sử dụng CloubBlobClient trong SDK lưu trữ - nó cung cấp chức năng ghi luồng ở đâu đó.

Lưu ý trong mã của bạn ở trên: bạn không chỉ định AssetCreationOptions.Ngoài ra, sẽ cho rằng tệp trong bộ nhớ sẽ được mã hóa lưu trữ (cơ chế chuyển mặc định là an toàn, không được bảo mật). Tôi không nghĩ rằng bạn sẽ thực hiện mã hóa lưu trữ trên luồng tệp của mình trước khi tải lên, vì vậy, bạn nên đặt mã đó thành AssetCreationOptions.None.

Cá nhân, tôi sẽ không đi tuyến đường này. Đọc bài viết trên blog của tôi trên 'tạo youtube của riêng bạn': http://blog-ndrouin.azurewebsites.net/?p=1471

Trong đó, có một ví dụ đầy đủ nội dung khách hàng tải lên sử dụng một url SAS cung cấp bởi phía máy chủ (trong đó có thông tin tài khoản của bạn, mà bạn có thể không muốn nổi xung quanh phía khách hàng của bạn!).

Khách hàng, tuy nhiên, phải có khả năng thực hiện PUT vào bộ nhớ bằng cách sử dụng URL SAS đó. Trong trường hợp của tôi, tôi đã sử dụng một ứng dụng dòng lệnh C#. Bạn sẽ không thể thực hiện việc này trong HTML5 trừ khi trang web của bạn được lưu trữ trên cùng một miền với tài khoản lưu trữ đích. Nếu trang web của bạn (hoặc I-Frame quản lý tải lên) không có cùng tên miền với tài khoản lưu trữ của bạn, điều này sẽ kích hoạt cuộc gọi "OPTIONS" CORS trong HTML5 sang lớp Azure Storage REST, chưa hỗ trợ CORS .

Các lựa chọn thay thế cho HTML5 I-Frame được lưu trữ trong tài khoản lưu trữ của bạn là: Sliverlight hoặc Flash tải lên shims với một tên miền chéo trong $ gốc của tài khoản lưu trữ của bạn (hoặc có lẽ các đối tượng plugin được lưu trữ trong tài khoản lưu trữ của bạn để tránh yêu cầu tên miền chéo).

Tôi sẽ không khuyến khích tải lên luồng phim lên máy chủ trong POST. Điều này làm cho dịch vụ web của bạn trở thành nút cổ chai cho tất cả các tệp gửi đến; và một POST dài không phải là đặc biệt ổn định: hồ bơi ứng dụng của bạn có thể được tái chế ở giữa quá trình tải lên và bạn là bánh mì nướng.

PS.Nhóm chúng tôi (Windows Azure Media Services) chủ yếu theo dõi chuyên mục này:

http://social.msdn.microsoft.com/Forums/en-US/MediaServices/threads

+0

Cảm ơn bạn đã trả lời và hướng! Tôi sẽ cố gắng thực hiện các bước trong bài viết của bạn tốt nhất có thể. Chúng tôi thực sự muốn triển khai giải pháp HTML5 trên cả hai đầu (người tải lên và người lập trình). –

Các vấn đề liên quan