azure 上傳blob到ams(CreateFromBlob)

来源:https://www.cnblogs.com/dawenyang/archive/2019/05/15/10871024.html
-Advertisement-
Play Games

遇到的錯誤:The destination storage credentials must contain the account key credentials,參數名: destinationStorageCredentials 解決方法:AccountName與AccountKey參數值錯誤 ...


遇到的錯誤:The destination storage credentials must contain the account key credentials,參數名: destinationStorageCredentials

解決方法:AccountName與AccountKey參數值錯誤

AccountName就是存儲賬戶名字

AccountKey值獲取方式:打開存儲賬戶-->訪問秘鑰-->key1或者key2

Azure上傳資產SDK

    public class AzureMediaServiceController : ApiController
    {
        // Read values from the App.config file.

        private static readonly string _AADTenantDomain =
            ConfigurationManager.AppSettings["AMSAADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
            ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"];
        private static readonly string _AMSClientId =
            ConfigurationManager.AppSettings["AMSClientId"];
        private static readonly string _AMSClientSecret =
            ConfigurationManager.AppSettings["AMSClientSecret"];

        private static CloudMediaContext _context = null;

        [HttpPost, Route("api/AzureMediaService/DeliverVideo")]
        // GET: AMSDeliverVideo
        public string DeliverVideo(string fileName)
        {
            GetCloudMediaContext();
            IAsset inputAsset = UploadFile(fileName, AssetCreationOptions.None);
            var strsasUri = PublishAssetGetURLs(inputAsset);
            return strsasUri;
        }
        /// <summary>
        /// 獲取媒體文件上下文
        /// </summary>
        private void GetCloudMediaContext()
        {
            AzureAdTokenCredentials tokenCredentials =
                new AzureAdTokenCredentials(_AADTenantDomain,
                    new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret),
                    AzureEnvironments.AzureCloudEnvironment);

            var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);
        }

        /// <summary>
        /// 創建新資產並上傳視頻文件
        /// </summary>
        /// <param name="fileName">上傳文件名稱,如:F:\BigBuck.mp4</param>
        static public IAsset UploadFile(string fileName, AssetCreationOptions options)
        {
            IAsset inputAsset = _context.Assets.CreateFromFile(
                fileName,
                options,
                (af, p) =>
                {
                    Console.WriteLine("Uploading '{0}' - Progress: {1:0.##}%", af.Name, p.Progress);
                });
            return inputAsset;
        }
        static public string PublishAssetGetURLs(IAsset asset)
        {
            // Publish the output asset by creating an Origin locator for adaptive streaming,
            // and a SAS locator for progressive download.
            //用於流媒體(例如 MPEG DASH、HLS 或平滑流式處理)的 OnDemandOrigin 定位符
            //_context.Locators.Create(
            //    LocatorType.OnDemandOrigin,
            //    asset,
            //    AccessPermissions.Read,
            //    TimeSpan.FromDays(30));

            //用於下載媒體文件的訪問簽名
            _context.Locators.Create(
                LocatorType.Sas,
                asset,
                AccessPermissions.Read,
                TimeSpan.FromDays(30));


            IEnumerable<IAssetFile> mp4AssetFiles = asset
                    .AssetFiles
                    .ToList()
                    .Where(af => af.Name.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase));


            // Get the URls for progressive download for each MP4 file that was generated as a result
            // of encoding.
            //List<Uri> mp4ProgressiveDownloadUris = mp4AssetFiles.Select(af => af.GetSasUri()).ToList();
            string mp4ProgressiveDownloadUris = mp4AssetFiles.Select(af => af.GetSasUri()).FirstOrDefault().OriginalString;

            return mp4ProgressiveDownloadUris;
            // Display the URLs for progressive download.   
            // mp4ProgressiveDownloadUris.ForEach(uri => Console.WriteLine(uri + "\n"));    

        }


        string storageConnectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
        string accountName = ConfigurationManager.AppSettings["AccountName"];
        string accountKey = ConfigurationManager.AppSettings["AccountKey"];

        /// <summary>
        /// 上傳blob文件到ams中
        /// </summary>
        /// <param name="fileName">文件名</param>
        public string UploadBlobFile(string fileName)
        {
            if (string.IsNullOrEmpty(fileName))
                return string.Empty;
            CloudStorageAccount storageAccount = null;
            CloudBlobContainer cloudBlobContainer = null;
            if (CloudStorageAccount.TryParse(storageConnectionString, out storageAccount))
            {
                try
                {
                    // 創建CloudBlobClient,它代表存儲帳戶的Blob存儲端點。
                    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();

                    //fileName = "https://qdlsstorage.blob.core.windows.net/video/20190514165259-魔術視頻.mp4";
                    //通過連接獲取容器名字和文件名字
                    var index = fileName.IndexOf(accountName, StringComparison.CurrentCultureIgnoreCase);
                    var temp = fileName.Substring(index + 1);
                    var fs = temp.Split('/');
                    var containerName = fs[1];
                    fileName = fs[2]; 這一段代碼根據你們自己的情況進行修改,我這個是因為傳遞的全路徑才這麼寫的

                    // 獲取Blob容器 
                    cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
                    GetCloudMediaContext();
                    var storageCredentials = new StorageCredentials(accountName, accountKey);
                    var cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(fileName);

                    cloudBlockBlob.FetchAttributes();//這一句是關鍵,如果不加這一句就會報錯,我把報錯信息放到下麵
                    var inputAsset = _context.Assets.CreateFromBlob(cloudBlockBlob, storageCredentials, AssetCreationOptions.None);
                    var strsasUri = PublishAssetGetURLs(inputAsset);
                    return strsasUri;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }

            }

            return null;
        }
    }

 

報錯信息:

<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code /><m:message xml:lang="en-US">AssetFile ContentFileSize must not be negative</m:message></m:error>

參考地址:https://github.com/Azure/azure-sdk-for-media-services-extensions/issues/40  (這是通過谷歌找到的資料,百度根本不行)

 

直接上傳文件到資產中調用方法:

                var virtualPath = "/UploadFile/Files/";
                        var path = HttpContext.Current.Server.MapPath(virtualPath);
                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                        var fileFullPath = $"{path}{fileName}";
                        try
                        {
                            file.SaveAs(fileFullPath);
                            var ams = new AzureMediaServiceController();
                            url = ams.DeliverVideo(fileFullPath);
                            result = true;
                            msg = $@"上傳視頻成功";
                            File.Delete(fileFullPath);
                        }
                        catch (Exception ex)
                        {
                            msg = "上傳文件寫入失敗:" + ex.InnerException + ex.Message + ex.InnerException?.InnerException + "fileFullPath=" + fileFullPath;
                        }

因為使用的是HTML自帶的file上傳控制項,傳遞給介面的文件地址全路徑是錯誤的,所以只能保存到介面伺服器本地,上傳到azure上去之後再刪除這個文件。

 

上傳blob到ams

               var ams = new AzureMediaServiceController();
                        var t = ams.UploadBlobFile(fileUrl);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在C#中字元串類型String是由一系列的單個字元組合而成,其實可以通過字元串String對象ToCharArray()方法來將字元串中的元素逐一存在數據類型為Char的一維數組中。 例如將字元str = "ABCDEFG"分割為到一維數組可用下列語句: 通過上述語句可得到以下結果: 備註:原文轉載 ...
  • 針對公網上線的網站系統,很多網站的功能變數名稱會同時含有帶www和不帶www的功能變數名稱解析記錄,如果需要同時解析帶www和不帶www的功能變數名稱信息,則需要在相應的功能變數名稱解析平臺(如阿裡雲功能變數名稱解析平臺、騰訊雲功能變數名稱解析平臺)設置不帶www的主功能變數名稱以及帶www的功能變數名稱解析記錄。同時在Web伺服器如IIS中配置對應的網站,II ...
  • 在IIS Web伺服器的網站配置的過程中,有時候需要一個網站配置對應多個功能變數名稱記錄,例如不帶www的主功能變數名稱以及帶www的功能變數名稱解析記錄對應同一個網站文件,此時最簡單的配置方法就是將一個網站綁定多個主機功能變數名稱,比新建多個網站然後對應一個網站文件簡單很多,並且後續修改網站相關配置的時候只需要修改一個網站即可。 ...
  • C#開發過程中針對字元串String類型的操作是常見操作,有時候業務需要判斷某個字元串是否以特定字元開頭或者特定字元結束,此時就可使用StartsWith方法來判斷目標字元串是否以特定字元串開頭,通過EndWith方法可判斷是否以某字元串結尾。 StartWith函數調用的格式為: strA.Sta ...
  • Ocelot(二) 請求聚合與負載均衡 作者:markjiang7m2 原文地址: 源碼地址:https://gitee.com/Sevenm2/OcelotDemo 在上一篇Ocelot的文章中,我已經給大家介紹了何為Ocelot以及如何簡單使用它的路由功能,如果你還沒有不瞭解Ocelot為何物, ...
  • 在C#開發過程中字元串String類處理過程中,有時字元串長度不夠時,需要在左側指定特定的字元來補足字元串長度,此時可以使用String類下的PadLeft方法對字元串的左邊進行按特定的字元和特定的長度進行補足。MSDN上對PadLeft函數的解釋是:返回指定長度的新字元串,其中當前字元串的開頭用空 ...
  • 在C#開發過程中字元串String類處理過程中,有時字元串長度不夠時,需要在右側側指定特定的字元來補足字元串長度,此時可以使用String類下的PadRight方法對字元串結尾按特定的字元補足位數。MSDN上對PadRight函數的解釋是:返回指定長度的新字元串,其中當前字元串的末尾用空格或指定的U ...
  • C# explicit interface implementation 某個類要實現兩個包含相同方法名的介面, 應該如何實現這兩個方法? 以上Demo中共有3個擁有相同方法名的interface,Program類繼承了這三個介面,使用explicit interface implementatio ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...