.NET 使用 Azure Blob 存储图片或文件

使用的是VS2017

一、先使用 NuGet 获取这两个包。 执行以下步骤:

在“解决方案资源管理器”中,右键单击你的项目并选择“管理 NuGet 包”。

1.在线搜索“WindowsAzure.Storage”,然后单击“安装” 以安装存储客户端库和依赖项。

2.在线搜索“WindowsAzure.ConfigurationManager”,然后单击“安装”以安装 Azure Configuration Manager。

会生成5个dll,如下图:

封装代码如下:

需要先引用

using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

1).AzureBlob.cs

public class AzureBlob
{
    #region 私有变量
    //类的成员,用于创建Blob服务客户端
    CloudBlobClient blobClient;

    //容器和Blob其实就相当于文件夹、文件名

    /// <summary>
    /// 连接字符串
    /// </summary>
    private string storageConnectionString = CloudConfigurationManager.GetSetting("StorageConnectionString");
    #endregion

    #region 构造函数创建Blob服务客户端
    public AzureBlob()
    {
        //解析配置中的连接字符串
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
        //创建Blob服务客户端
        blobClient = storageAccount.CreateCloudBlobClient();
    }
    #endregion

    #region 获取块Blob引用
    /// <summary>
    /// 获取块Blob引用
    /// </summary>
    /// <param name="mycontainer">容器名</param>
    /// <param name="fileName">文件名</param>
    /// <returns></returns>
    public CloudBlockBlob GetContainer(string mycontainer, string fileName)
    {
        //获取容器的引用
        CloudBlobContainer container = blobClient.GetContainerReference(mycontainer);
        //获取块 Blob 引用
        CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
        return blob;
    }
    #endregion

    #region 二进制形式上传文件
    /// <summary>
    /// 二进制形式上传文件
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    /// <param name="bytes">二进制形式的文件</param>
    /// <returns>异步信息</returns>
    public Task UploadToBlob(string fileName,string mycontainer,byte[] bytes)
    {
        //获取容器的引用
        CloudBlobContainer container = blobClient.GetContainerReference(mycontainer);
        //创建一个容器(如果该容器不存在)
        container.CreateIfNotExists();
        //设置该容器为公共容器,也就是说网络上能访问容器中的文件,但不能修改、删除
        container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
        //将Blob(文件)上载到容器中,如果已存在同名Blob,则覆盖它
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);//获取块 Blob 引用
        Task result = blockBlob.UploadFromByteArrayAsync(bytes, 0, bytes.Length);//将二进制文件上传
        return result;
    }
    #endregion

    #region 文件路径上传
    /// <summary>
    /// 文件路径上传
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    /// <param name="filePath">文件路径</param>
    /// <returns></returns>
    public string UploadToBlob(string fileName, string mycontainer,string filePath)
    {
        ////获取容器的引用
        CloudBlobContainer container = blobClient.GetContainerReference(mycontainer);
        //创建一个容器(如果该容器不存在)
        container.CreateIfNotExists();
        //设置该容器为公共容器,也就是说网络上能访问容器中的文件,但不能修改、删除
        container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
        //将Blob(文件)上载到容器中,如果已存在同名Blob,则覆盖它
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);//获取块 Blob 引用
        //文件路径
        using (var fileStream = System.IO.File.OpenRead(filePath))
        {
            blockBlob.UploadFromStream(fileStream);
        }
        return blockBlob.Uri.ToString();
    }
    #endregion

    #region 根据文件名和容器名取到Blob地址
    /// <summary>
    /// 根据文件名和容器名取到Blob地址
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    /// <returns></returns>
    public string GetBlobURI(string fileName, string mycontainer)
    {
        CloudBlockBlob blob = GetContainer(mycontainer, fileName);
        return blob.Uri.ToString();
    }
    #endregion

    #region 下载Blob
    /// <summary>
    /// 下载Blob
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    /// <param name="fliePath">文件路径</param>
    public void DownloadToFile(string fileName, string mycontainer, string fliePath)
    {
        CloudBlockBlob blob = GetContainer(mycontainer, fileName);
        using (var fileStream = File.OpenWrite(fliePath))
        {
            blob.DownloadToStream(fileStream); //将blob保存在指定路径
        }
    }
    #endregion

    #region 下载Blob
    /// <summary>
    /// 下载Blob
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    /// <param name="fliePath">文件路径</param>
    public string DownloadToStream(string fileName, string mycontainer)
    {
        CloudBlockBlob blob = GetContainer(mycontainer, fileName);
        string text;
        using (var memoryStream = new MemoryStream())
        {
            blob.DownloadToStream(memoryStream);
            text = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
        }
        return text;
    }
    #endregion

    #region 下载Blob
    /// <summary>
    /// 下载Blob
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    /// <param name="fliePath">文件路径</param>
    public void DownloadToFileStream(string fileName, string mycontainer, string fliePath)
    {
        CloudBlockBlob blob = GetContainer(mycontainer, fileName);
        using (var fileStream = new FileStream(fliePath, FileMode.OpenOrCreate))
        {
            blob.DownloadToStream(fileStream); //将blob保存在指定路径
        };
    }
    #endregion

    #region 删除Blob
    /// <summary>
    /// 删除Blob
    /// </summary>
    /// <param name="fileName">文件名</param>
    /// <param name="mycontainer">容器名</param>
    public void DeleteBlob(string fileName, string mycontainer)
    {
        CloudBlockBlob blob = GetContainer(mycontainer, fileName);
        blob.Delete();
    }
    #endregion
}

2).单元测试类:class AzureBlob_Test.cs

[TestClass]
public class AzureBlob_Test
{
    AzureBlob azureBlob = new AzureBlob();
    private string containername = ConfigurationManager.AppSettings["userimg"].ToString();

    [TestMethod]
    public void TestUploadToBlob()
    {
        //string imgCode = ""

        //Byte[] buffer = Convert.FromBase64String(imgCode.Replace(" ", "+"));
        //var result = azureBlob.UploadToBlob("test", containername, buffer);

        string str = "userImg/430223198701159158_601421613.png";
        var str1 = str.Contains("/");

        Assert.IsTrue(str1);
    }

    [TestMethod] //OK
    public void TestGetBlobURI()
    {
        var result = azureBlob.GetBlobURI("test", containername);
        Assert.IsNotNull(result);//https://08afc0c4store.blob.core.chinacloudapi.cn/images/test
    }

    [TestMethod] //OK
    public void TestUploadToBlob2()
    {
        var fileName = "1_2.jpg";
        var filePath = @"F:\img\"+ fileName;
        azureBlob.UploadToBlob(fileName, containername, filePath);
    }

    [TestMethod]
    public void TestDownloadToFile()
    {
        var fileName = "2017.jpg";
        var filePath = @"images\2017.jpg";
        //filePath = azureBlob.GetBlobURI(fileName, containername);
        azureBlob.DownloadToFile(fileName, containername, filePath);
    }

    [TestMethod]
    public void TestDownloadToStream()
    {
        var fileName = "2017.jpg";;
        //filePath = azureBlob.GetBlobURI(fileName, containername);
        azureBlob.DownloadToStream(fileName, containername);
    }

    [TestMethod]
    public void TestDownloadToFileStream()
    {
        var fileName = "2017.jpg"; ;
        var filePath = @"test\2017.jpg";
        //filePath = azureBlob.GetBlobURI(fileName, containername);
        azureBlob.DownloadToFileStream(fileName, containername, filePath);
    }

    [TestMethod] //OK
    public void TestDeleteBlob()
    {
        var fileName = "2017.jpg";
        azureBlob.DeleteBlob(fileName, containername);
    }
}

3).在web.config 下的<configuration>-><appSettings>下添加:

<!--存储图片连接字符串 -->
<add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=test;AccountKey=1234;EndpointSuffix=core.chinacloudapi.cn" />
<!--容器名,必须是小写-->
<add key="test" value="test" />

4).通过Azure Storage Explorer 6查看上传的图片,下载地址为:http://azurestorageexplorer.codeplex.com/releases/view/125870 下的 AzureStorageExplorer6Preview3.zip

参考:http://www.jianshu.com/p/bf265c6ceedd

https://docs.azure.cn/zh-cn/storage/storage-dotnet-how-to-use-blobs

相关开发资源 https://docs.azure.cn/zh-cn/storage/

时间: 2024-10-10 17:53:42

.NET 使用 Azure Blob 存储图片或文件的相关文章

使用Windows Azure Blob 存储服务进行 SQL Server 备份和还原

好处: 1.灵活.可靠.无限制, 安全的站点外存储 2.即时.高度可用.耐久的备份存档方案. 3.仅对使用的服务付费.可以作为经济合算的站点外备份存档方案. 对于 Windows Azure Blob 存储服务的 SQL Server 备份支持是 SQL Server 2012 SP1 CU2 增强功能,当然sql server 2014也是可以的. 第 1 课:创建 Windows Azure 存储对象 步骤: 1.创建 Windows Azure 存储帐户和 Blob 容器. 创建存储账户,

BLOB存储图片文件二进制数据是非对错

子在一天一天虚度,生活也在一天一天中茫然 做人做事哪能尽如人意,付出多少收获多少虽然存在偏颇,但是不劳而获的心态是万万不对的,更不能去怨天尤人,低调为人.做好自己就可以了 改进你的系统的最好的方法是先避免做“蠢事”.我并不是说你或你开发的东西“蠢”,只是有些决定很容易被人们忽略掉其暗含的牵连,认识不到这样做对 系统维护尤其是系统升级带来多大的麻烦.作为一个顾问,像这样的事情我到处都能见到,我还从来没有见过做出这样的决定的人有过好的结果的. 图片,文件,二进制数据 既然数据库支持 BLOB 类型的

Azure Blob存储更改缓存时间

Azure的Blob存储可以作为Http的服务来使用.很多客户已经把Blob作为图片存储的服务,这样稍作代码的修改,解决了图片服务器带宽.性能等多种问题. 但同时问题也出现了:在传统Http的服务中很多meta属性是可以设置的,但在blob中如何设置. 比如,在Apache中,可以设置静态内容的缓存时间: 如果想把max-age的时间更改的更长,在Apache中,可以修改配置文件/etc/httpd/conf/httpd.conf #LoadModule headers_module modul

使用Azure Blob存储

可以通过多种方式来对Azure Blob进行操作.在此我们介绍通过VS的客户端及代码两种方式来操作Blob. 一.通过VS来操作Blob. 1.首先下载publish settings 文件:打开“https://manage.windowsazure.cn/publishsettings/index”,登陆China Azure,下载publish Settings文件到本地. 2.      打开Visual Studio, 选择 View -> Server Explorer 3.    

使用Azure Blob优化Hadoop集群存储成本

大数据与云计算的关系就像一枚硬币的正反面一样密不可分,大数据是云计算非常重要的应用场景,而云计算则为大数据的处理和数据挖掘都提供了最佳的技术解决方案.云计算的快速供给.弹性扩展以及按用量付费的优势已经给IT行业带来了巨大变化,它已经日益成为企业IT的首选.在让企业通过数据洞察提升效率和效益的同时,如何降低大数据平台成本也是IT部门经常关心的问题. 为什么用Azure Blob作为Hadoop分布式文件系统管理大数据? HDFS是Hadoop集群分布式文件系统,它将文件分割为数据块Block,默认

在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析

在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析 低成本的Blob存储是一个强大的,通用的Hadoop兼容Azure存储解决方案无缝集成HDInsight.通过Hadoop分布式文件系统(HDFS)接口,完整的组件集合在HDInsight可以 在Blob存储数据的直接操作.在本教程中,学习如何建立一个容器的Blob存储,然后在里面处理的数据. 在BLOB存储中存储的数据能够用于计算的HDInsight集群被安全地删除,而不会丢失用户数据. 注意: 该ASV://语法中不支持

使用PowerShell创建Azure Storage的SAS Token访问Azure Blob文件

Azure的存储包含Storage Account.Container.Blob等具体的关系如下: 我们常用的blob存储,存放在Storage Account的Container里面. 目前有三种方式可以把Blob里的内容共享给其他用户,这三种方式是: 1.把Container的属性设置为公共容器 2.把Blob属性设置为公共公共Blob 设置好后,blob就可以通过wget的方式下载下来. 3.通过SAS Token的方式实现在一定时间段内的文件共享 SAS是shared access si

微软Azure云主机及blob存储的网络性能测试

  微软Azure云主机及blob存储的网络性能测试 1. 测试目的 本次测试的目的在于对微软Azure的云主机.blob存储的网络性能以及DNS解析的稳定性做相关测试,评估其是否能够满足我们业务的需求. 2. 测试项目 ? 微软Azure云主机的网络性能 ? 微软blob存储的网络性能 ? DNS解析稳定性测试 3. 测试方法 本次测试使用多种第三方分布式工具作为访问源及评测工具,比照测试结果数据,以综合评估微软Azure的网络性能及稳定性. 4. 网络性能测试 4.1. 网络带宽测试 我们通

转-关于图片或者文件在数据库的存储方式归纳

商品图片,用户上传的头像,其他方面的图片.目前业界存储图片有两种做法: 1.  把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据.比如mysql中有个blob字段.oracle数据库中是blob或bfile类型 2.  图片存储在磁盘上,数据库字段中保存的是图片的路径. 一.图片以二进制形式直接存储在数据库中 第一种存储实现(php语言): 大体思路: 1.将读取到的图片用php程序转化成二进制形式.再结合insert into 语句插入数据表中的blob类型字