azure 上传blob到ams(CreateFromBlob)

遇到的错误: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);

原文地址:https://www.cnblogs.com/dawenyang/p/10871024.html

时间: 2024-10-29 02:39:15

azure 上传blob到ams(CreateFromBlob)的相关文章

ORACEL上传BLOB,深度遍历文件夹

// uploadingDlg.cpp : 实现文件// #include "stdafx.h"#include "uploading.h"#include "uploadingDlg.h"#include "afxdialogex.h" #ifdef _DEBUG#define new DEBUG_NEW#endif // CuploadingDlg 对话框 CuploadingDlg::CuploadingDlg(CWnd

html5图片缩放后上传blob

环境:前端用的jquery    bootstrap, 后端用的springboot 前端代码:(这些代码是单独从原项目中摘取出来放在HBuilder中运行的,所以如果放在真实的项目环境的话,修改一下静态文件的路径即可) github地址:https://github.com/earnop/uploadimg 原文地址:https://www.cnblogs.com/know-more/p/11497228.html

Vbs脚本将本地文件上传到Azure存储账户

说到Azure相信大家都已经非常熟悉了,所以就不做多介绍了,我们都知道在Azure上有一个存储账户,在存储账户下可以可以创建容器,可以存放数据,近期公司呢为了达到数据的安全性,准备将本地的备份数据给Azure存储账户下备份一份: Azure提供了很多方法可以将本地的文件上传到Azure存储账户下,比如Powershell.Azcopy.存储文件管理工具,但是存储工具和powershell不支持断点续传,只有Azcopy支持断点续传,所以我们就用Azcopy进行数据的传输,在此说一下Azcopy也

移动前端—H5实现图片先压缩再上传

在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上传显然不是一个好办法. 目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的实现.根据查看caniuse,本demo里使用到的FileReader.Blob.Formdata对象均已在大部分移动设备浏览器中得到了实现(safari6.0+.android 3.0+),所以直接在前

js图片前端压缩多图上传(旋转其实已经好了只是手机端有问题要先压缩再旋转)

var filechooser = document.getElementById("choose"); // 用于压缩图片的canvas var canvas = document.createElement("canvas"); var ctx = canvas.getContext('2d'); // 瓦片canvas var tCanvas = document.createElement("canvas"); var tctx = tC

移动端图片上传老失败

做移动端开发的时候,form里面的file后台经常获取不到,用foemdata也拿不到 找到了一个formdata的脚本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-s

跟我学Windows Azure 五 使用Cloub Service连接Blob Service完成图片的上传

首先,我们创建一个云服务项目,用来演示我们的blob存储 下来我们修改我们我们云服务的名字 我们需要添加一个空的WebForm的项目 点击完成,我们可以看到我们的解决方案已经添加完成 下来我们需要添加一个实体类,用来存储文件的信息. 下面是我们实体类的 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace BlobWebRole { public class I

Windows Azure 系列-- 使用Azure + Web API实现图片上传

1. 创建1个Azure账号,登录之后创建1个AzureStorage,左下方点Manage Access会看到Primary Access Key和Storage Account,记住它们的位置,等下需要配置到Web.config中. 2. 创建Web.Api project,上传图片的代码: [HttpPost] public async Task<HttpResponseMessage> PostFile() { HttpRequestMessage request = Request;

超大文件上传到Azure Linux虚拟机最佳实践

客户在实际进行迁移的时候,往往碰到需要将本地数据中心的超大文件,比如单个200GB的文件,或者总共1TB的无数文件上传到Azure上的情况,尤其是传到Azure的Linux虚拟机的场景,这种场景包括: 大日志文件上传到Azure进行分析 数据库备份文件导入导出 大数据文件下载到本地等等 尤其是要将数据库备份文件导入到Linux虚拟机进行数据库恢复,一般用户常常会选择传统的FTP方式进行处理,这样的方式通常会花费用户十几个小时,甚至几天的时间进行文件传输,但是在云计算的时代,其实有非常多的工具和方