1.我们在本地开发如果没有Azure 账户及blob资源,可以在本地调试开发

所需工具下载:Azure 存储管理器下载可以在本地创建容器Container及Blob 上传所需文件对文件进行操作 也可以管理Azure云的Blob

Azure 存储资源管理器 – 云存储管理 | Microsoft Azure

2.打开后创建本地Blob存储

3.本地端口可以为空

3. 点击local blob创建blob

以上创建的必须配合Azurite仿真存储器使用否则无法本地调试 下面下载仿真器

4.下载Vs2022自带的Azure 存储模拟器

使用 Azurite 模拟器进行本地 Azure 存储开发 | Microsoft Docs

5.启动仿真器

可以在 Visual Studio 安装的扩展文件夹中找到 Azurite 可执行文件。 具体位置根据安装的 Visual Studio 版本而有所不同。 例如,如果已在 Windows 计算机或虚拟机 (VM) 上安装 Visual Studio 2022 专业版,可在此位置找到 Azurite 可执行文件:C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\Extensions\Microsoft\Azure Storage Emulator

运行可执行文件后,Azurite 将侦听连接。

6.CMD命令 下启动如下:

8.此时我们可以在创建的本地存储器查看Blob等信息并且创建文件目录和上传文件

如果本地账户的容器一直打不开并且爆错误,建议重启机器然后分离右键分离所有容器重新创建一个

我本地Blob容器名称叫myblob 点击上传文件 也可以在本地blob创建指定的文件夹我创建的文件夹为Data 然后上传ExcelData本地文件夹的文件

9. 配置连接AzureClient的连接字符串信息

点击本地存储器配置的名称local-1 左下角有显示连接字符串信息

10.复制此信息配置到appsetting.json,连接信息包含blob账户名,AccountName,AccountKey

BlobEndpoint,QueueEndpoint,TableEndpoint等信息

11. 本地调试代码:

BlobService:

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TestAzure.AzureCore.AzureBlob
{/// <summary>/// Azure Blob 扩展服务方法/// </summary>public class BlobService : IBlobService{private readonly BlobServiceClient _blobServiceClient;private readonly IConfiguration _configuration;private string _azureStorageConnectStr;private string _containerName;public BlobService(BlobServiceClient blobServiceClient, IConfiguration configuration){this._blobServiceClient = blobServiceClient;_configuration = configuration;_azureStorageConnectStr = _configuration.GetSection("AZURE_STORAGE_CONNECTION_STRING").Value;_containerName = _configuration.GetSection("AzureContainerName").Value;}//public  void InitBlobClientConfig(IConfiguration configuration)//{//    _azureStorageConnectStr = _configuration.GetSection("AZURE_STORAGE_CONNECTION_STRING").Value;//    _containerName = _configuration.GetSection("AzureContainerName").Value;//}#region 01,获取Blob,根据blob名称+async Task<BlobInfo> GetBlobAsync(string name)/// <summary>/// 获取Blob,根据blob名称/// </summary>/// <param name="name">blob名称</param>/// <returns></returns>public async Task<BlobDownloadInfo> GetBlobAsync(string name){//获取BlobServiceClient//BlobContainerClient container = new BlobContainerClient(_azureStorageConnectStr, ("sample-container"));//获取容器BlobContainerClientvar containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);//获取blob根据文件名称(文件名称为存储器Blob下面的全路径+File文件及扩展名 )//例如 Blob文件夹结构入下:myblob>Data>mylog.xlsx myblob为容器名称 data为文件夹 则name= Data > mylog.xlsxvar blobClient = containerClient.GetBlobClient(name);var blobDownLoadInfo = await blobClient.DownloadAsync();return blobDownLoadInfo;}#endregion#region 02,获取所有Blob名称+async Task<IEnumerable<string>> ListBlobsNameAsync()/// <summary>/// 获取所有Blob名称/// </summary>/// <returns></returns>public async Task<IEnumerable<string>> ListBlobsNameAsync(){var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);var items = new List<string>();await foreach (var blobItem in containerClient.GetBlobsAsync()){items.Add(blobItem.Name);}return items;}#endregion#region 03,上传图片流,根据文件路径和文件名称+async Task UploadFileBlobAsync(string filePath, string filename)/// <summary>/// 上传图片流,根据文件路径和文件名称/// </summary>/// <param name="filePath">文件路径</param>/// <param name="filename">文件名称</param>/// <returns></returns>public async Task UploadFileBlobAsync(string filePath, string filename){var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);var blobClient = containerClient.GetBlobClient(filename);await blobClient.UploadAsync(filePath, new BlobHttpHeaders { ContentType = filePath.GetContentType() });}#endregion#region 04,上传文件流,根据文件内容和文件名称+async Task UploadContentBlobAsync(string content, string filename)/// <summary>/// 上传文件流,根据文件内容和文件名称/// </summary>/// <param name="content">文件内容</param>/// <param name="filename">文件名称</param>/// <returns></returns>public async Task UploadContentBlobAsync(string content, string filename){var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);var blobClient = containerClient.GetBlobClient(filename);var bytes = Encoding.UTF8.GetBytes(content);await using var memoryStream = new MemoryStream(bytes);await blobClient.UploadAsync(memoryStream, new BlobHttpHeaders() { ContentType = filename.GetContentType() });}#endregion#region 05,删除Blob+async Task DeleteBlobAsync(string blobName)/// <summary>/// 删除Blob/// </summary>/// <param name="blobName">blob名称</param>/// <returns></returns>public async Task DeleteBlobAsync(string blobName){var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);var blobClient = containerClient.GetBlobClient(blobName);await blobClient.DeleteIfExistsAsync();}#endregion#region 06,在账户下创建容器/// <summary>/// 06 获取该账户下Blob 所有容器/// </summary>/// <returns></returns>public async Task<BlobContainerClient> CreateBlobContainerAsync(string containerName){// Create a BlobServiceClient object which will be used to create a container clientBlobServiceClient blobServiceClient = new BlobServiceClient(_azureStorageConnectStr);//Create a unique name for the container//string containerName = "quickstartblobs" + Guid.NewGuid().ToString();// Create the container and return a container client objectBlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);return containerClient;}#endregion#region 07,获取该账户下所有Container/// <summary>/// 07 获取该账户下Blob 所有容器/// </summary>/// <returns>容器名称</returns>public async Task<List<BlobContainerItem>> GetBlobContainersAsync(){var containers = _blobServiceClient.GetBlobContainersAsync();var items = new List<BlobContainerItem>();await foreach (var blobItem in containers){items.Add(blobItem);}return items;}#endregion#region 08,将下载的Blob文件进行保存/// <summary>///8. 将下载的Blob文件进行保存/// </summary>/// <param name="fileFullPath"></param>/// <param name="blobinfo"></param>/// <returns></returns>public async Task SaveStreamToFile(string fileFullPath, BlobDownloadInfo blobinfo){var contentleng = blobinfo.ContentLength;if (contentleng == 0) return;var stream = blobinfo.Content;if (!stream.CanRead) return;using (FileStream fileStream = File.Create(fileFullPath)){//await stream.CopyToAsync(fileStream);await CopyStream(stream, fileStream);//避免多次fileStream关闭}}/// <summary>/// 9. 文件流拷贝/// </summary>/// <param name="input"></param>/// <param name="output"></param>/// <returns></returns>private async Task CopyStream(Stream input, Stream output){byte[] buffer = new byte[1024];int len;while ((len = input.Read(buffer, 0, buffer.Length)) > 0){await output.WriteAsync(buffer, 0, len);}}#endregion#region Blob 同步任务扩展下载方法/// <summary>/// 根据文件名获取并下载文件到本地/// </summary>/// <param name="fileName">文件名称</param>/// <returns></returns>public async Task<List<string>> GetDownLoadAllBlobsAndCopyAzFileToLocalAsync(){try{var azfilepath = string.Empty;var localFilePath = new List<string>();var localPath = _configuration.GetSection("LocalFilePath")?.Value;var localBakPath = _configuration.GetSection("LocalBakPath")?.Value;var backPath = Path.Combine(localBakPath, DateTime.Now.ToString("yyyyMMdd"));// 创建备份及本地临时目录if (!Directory.Exists(localPath)){Directory.CreateDirectory(localPath);}if (!Directory.Exists(backPath)){Directory.CreateDirectory(backPath);}//1 Azure 判断是否存在此文件var azureBlobNameList = await ListBlobsNameAsync();var blobNames = azureBlobNameList.Count() > 0 ? azureBlobNameList.Select(x => x.Split("/").LastOrDefault()).ToList() : localFilePath;//string[] files = Directory.GetFiles(azurePath, "*.xlsx");string[] azureFileList = new string[]{"a.xlsx", "b.xlsx",};// 校验传入文件名称是否正确//if (!azureFileList.Any(x => x == fileName)) return null;var missFile = new List<string>();foreach (var azname in azureFileList){if (!blobNames.Any(x => x == azname)){missFile.Add(azname);}}//检查是否是Job同步的所有文件都匹配并且相同,Azure blob是否存在新文件if (missFile.Count > 0){return localFilePath;}//2 检查本地有没有下载文件&同步完成同步,有则直接返回对应文件地址var localfiles = Directory.GetFiles(localPath, "*.xlsx").ToList();// a. 检查本地和Azure 是否都没有文件 都没有 则返回if (localfiles.Count() == 0 && blobNames.Count() == 0) return localFilePath;// b. Azure在同步中有心文件 本地有Azure有先同步本次本地的if (localfiles.Count() == azureFileList.Length && blobNames.Count == azureFileList.Length){// 避免多次Copyreturn localfiles;}//3 Azure有Blobs,本地没有,则下载Az到临时本地var localfile = await DownLoadAllBlobsAndCopyAzFileToLocalAsync(azureBlobNameList.ToList());return localfile;}catch (Exception){throw;}}/// <summary>/// 下载Blob文件到本地临时目录后删除Azure blobs/// </summary>/// <param name="azList"></param>/// <returns></returns>public async Task<List<string>> DownLoadAllBlobsAndCopyAzFileToLocalAsync(List<string> blobList){//获取AzureBlob 文件列表string[] fileExes = new string[] { "*.xlsx", "*.xls" };List<string> localFilePath = new List<string>();List<BlobDownloadInfo> downloadInfos = new List<BlobDownloadInfo>();foreach (var name in blobList){var blobinfo = await GetBlobAsync(name);var filename = name.Split("/").LastOrDefault();if (string.IsNullOrEmpty(filename)) continue;else{var localpath = _configuration.GetSection("LocalFilePath").Value;var savepath = Path.Combine(localpath, filename);await SaveStreamToFile(savepath, blobinfo);localFilePath.Add(savepath);}}// 拷贝完成后删除Azure Blob// 获取目前Azure Blob文件并删除//var azureBlobNameList = await ListBlobsNameAsync();//foreach (var blobName in azureBlobNameList)//{//    await DeleteBlobAsync(blobName);//}return localFilePath;}/// <summary>/// 删除同步的本地临时文件夹,并且将本地同步文件备份到备份目录/// </summary>/// <returns></returns>public async Task DeleteLocalAndBakToBakLocalFileAsync(){try{var localpath = _configuration.GetSection("LocalFilePath")?.Value;var localBakPath = _configuration.GetSection("LocalBakPath")?.Value;var backPath = Path.Combine(localBakPath, DateTime.Now.ToString("yyyyMMdd"));if (!Directory.Exists(localBakPath)) Directory.CreateDirectory(localBakPath);//备份到本地string[] files = Directory.GetFiles(localpath, "*.xlsx");foreach (var file in files){var filename = Path.GetFileName(file);string pFilePath = backPath + "\\" + filename;// 移动到备份目录File.Move(file, pFilePath, true);}获取目前Azure Blob文件并删除//var azureBlobNameList = await ListBlobsNameAsync();//foreach (var blobName in azureBlobNameList)//{//    await DeleteBlobAsync(blobName);//}}catch (Exception){throw;}}#endregion}}

IBlobService:

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TestAzure.AzureCore.AzureBlob
{/// <summary>/// Azure Blob 扩展方法服务/// </summary>public interface IBlobService{Task<BlobDownloadInfo> GetBlobAsync(string name);Task<IEnumerable<string>> ListBlobsNameAsync();Task UploadFileBlobAsync(string filePath, string filename);Task UploadContentBlobAsync(string content, string filename);Task DeleteBlobAsync(string blobName);Task SaveStreamToFile(string filepath, BlobDownloadInfo blobinfo);Task<BlobContainerClient> CreateBlobContainerAsync(string containerName);Task<List<BlobContainerItem>> GetBlobContainersAsync();Task<List<string>> GetDownLoadAllBlobsAndCopyAzFileToLocalAsync();Task<List<string>> DownLoadAllBlobsAndCopyAzFileToLocalAsync(List<string> azList);Task DeleteLocalAndBakToBakLocalFileAsync();}
}

12. 注入BlobService服务BlobClient服务

13.Service引用可以下载Nuget包

AzureBlob 一般获取文件 步骤

 public async Task GetBlobAsync(string name,string connectStr){//获取BlobServiceClientBlobServiceClient blobServiceClient = new BlobServiceClient(connectStr);//获取容器BlobContainerClientvar containerClient = blobServiceClient.GetBlobContainerClient("myblob");//获取blob根据文件名称(文件名称为存储器Blob下面的全路径+File文件及扩展名 )//例如 Blob文件夹结构入下:myblob>Data>mylog.xlsx myblob为容器名称 data为文件夹 则name= Data > mylog.xlsxvar blobClient = containerClient.GetBlobClient(name);var blobDownLoadInfo = await blobClient.DownloadAsync();var stream = blobDownLoadInfo.Value.Content;var contentLength= blobDownLoadInfo.Value.Content.Length;//获取会报错var downloadInfo= blobDownLoadInfo.Value as BlobDownloadInfo;var realFileLength = downloadInfo.ContentLength;}

参考官方代码示例:

https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/storage/Azure.Storage.Files.DataLake/samples/Sample01b_HelloWorldAsync.cs#L224

Azure Blob 文件下载及本地开发使用配置相关推荐

  1. erpnext v13 安装部署 + VSCode本地开发环境配置

    ERPNext Version-13 安装生产环境 参考链接 https://discuss.erpnext.com/t/install-frappe-erpnext-v13-beta-from-sc ...

  2. 在linux下怎么解除git本地仓库_Linux从Git仓库创建到本地开发SSH配置

    最近做了些开发环境构建的工作,记录一下以备以后所需,本次构建的本地开发环境为win10,开发服务器为centos8. centos8安装git及开发仓库相关配置 # git安装 [root@#loca ...

  3. 一文读懂python本地开发环境配置

    python和java包管理的不同 java java需要安装jdk,我们通常使用maven进行包管理,有中央仓库,有本地仓库,项目优先从本地仓库拉取,拉不到会从远程仓库拉取,所有项目用到的包都会放在 ...

  4. Azure blob 文件下载

    1.获取所有Azure 容器中的资源文件 private string azureConnectionStrig = " DefaultEndpointsProtocol = https; ...

  5. linux history nginx,vue-router History 本地开发环境和nginx配置

    vue-router mode=history本地开发环境配置 解决方法1.修改webpack的的devServer配置项(devServe存在于,rvue-cli2在webapck.config.j ...

  6. 微信小程序从本地开发环境到线上测试环境和生产环境的配置

    这篇文章是对慕课网mpvue实战项目视频过程中环境的配置的总结与更新(因为小程序文档时不时就更新) 项目源码:https://github.com/suhuashan/bookCommentSyste ...

  7. AzCopy – 上传/下载 Windows Azure Blob 文件

    在我们收到的请求中,有一个频繁出现的请求是提供一种能在 Windows Azure Blob 存储与其本地文件系统之间轻松上传或下载文件的方法.一年半前, 我们很高兴地发布了 AzCopy, Wind ...

  8. 精通WordPress设计与开发:第3章 本地开发WordPress

    本章内容: ➤本地开发 ➤搭建一个本地开发环境 ➤配置本地开发环境 ➤发布本地项目 现在你已经知道如何使用WordPress以及基本的布局,让我们看看如何开始使用WordPress做一些事情,而不仅仅 ...

  9. phpstudy2018修改网站根目录以及本地域名访问配置方法

    phpstudy2018此版本修改网站根目录和之前版本还是有一定的区别,区别就是之前的版本只需要修改apache中的http.conf文件就可以而2018版本还需要修改vhosts文件配置. 不过我们 ...

最新文章

  1. 段寄存器和8种地址寻址方式
  2. 参与有奖 | Arthas 第 5 期征文活动火热开启!(内附第四期中奖名单)
  3. linux make编译报错 mv,Linux下安装redis
  4. Bailian2930 加减乘除【水题】
  5. reader技巧总结2.1.doc
  6. 解决echarts官网打不开访问失败问题
  7. CANoe——CanTest模块信号测试函数
  8. cdr x4检测显示软件产品已被禁用警告弹窗,如何解决教程分享
  9. 师董正伟:商务部受理微软涉垄断案
  10. 局域网内无法访问打印机的问题
  11. Google 三大论文之——MapReduce
  12. 40个重要的HTML5面试题及答案
  13. 五子棋AI - 蒙特卡洛树搜索
  14. 小程序 rich-text 修改图片和文字样式
  15. script src 方式传递参数
  16. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储
  17. Thingsboard 开源 IoT 物联网平台入门
  18. Downloading NEX-GDDP data from google Earth Engine
  19. UI自动化测试工具探索:Airtest
  20. 刀魔王带你了解QDC五金模的几种分类

热门文章

  1. MySQL 实现FULL JOIN的几种方式
  2. python网络安全怎么学_新手如何学习网络安全?
  3. Ubuntu16.04搜索不到wifi列表
  4. 飞瞳引擎集装箱人工智能API集装箱箱况检测演示,全球No.1集装箱AI企业中集飞瞳,完成全球百万AI集装箱箱况检验上亿集装箱检测
  5. zookeepr 简介
  6. apache的ab压力测试介绍
  7. 关于字符的一些Tips
  8. 计算机网络思维导图_计算机网络面试指南 考研/校招
  9. 浏览器的安全机制\ XSS
  10. 计算机网络与通信之局域网