从Azure文件共享读取图片路径并存入Azure表存储,附上传实现代码
实现从Azure文件共享读取图片路径并存储到Azure表存储
嘿,我来帮你搞定这个需求!结合你已经写好的Azure文件共享上传代码,我给你整理了一套完整的实现方案,一步步来:
1. 读取文件共享中的图片路径
你已经成功创建了CloudFileShare实例,接下来我们可以遍历共享里的文件(支持根目录和子目录递归遍历),获取每个图片的完整路径:
遍历根目录文件(基础版)
如果你的图片都存在文件共享的根目录下,直接用这段代码就行:
// 基于你已有的fileShare实例,获取根目录 CloudFileDirectory rootDir = fileShare.GetRootDirectoryReference(); // 遍历根目录下的所有文件 var fileItems = rootDir.ListFilesAndDirectories(); foreach (var item in fileItems) { if (item is CloudFile cloudFile) { // 获取图片的完整URL路径(也可以根据需求存相对路径,比如cloudFile.Name) string imageFullPath = cloudFile.Uri.ToString(); // 调用存储到表存储的方法(后面会实现) await StoreImagePathToTable(imageFullPath); } }
递归遍历子目录(进阶版)
如果图片分布在不同子目录里,写个递归方法来遍历所有层级:
private async Task TraverseAllFiles(CloudFileDirectory currentDir) { var items = currentDir.ListFilesAndDirectories(); foreach (var item in items) { if (item is CloudFile imageFile) { string imagePath = imageFile.Uri.ToString(); await StoreImagePathToTable(imagePath); } else if (item is CloudFileDirectory subDir) { // 递归遍历子目录 await TraverseAllFiles(subDir); } } } // 调用方式:await TraverseAllFiles(fileShare.GetRootDirectoryReference());
2. 实现Azure表存储的存储逻辑
接下来我们要把拿到的图片路径存入Azure表存储,首先需要定义一个表实体类,然后编写存储方法:
定义表实体类
表存储要求实体必须继承TableEntity,我们可以添加一些额外属性(比如上传时间):
public class ImagePathRecord : TableEntity { public ImagePathRecord() { // 按业务设置分区键,这里统一用"ImagePaths";行键用Guid保证唯一性 PartitionKey = "ImagePaths"; RowKey = Guid.NewGuid().ToString(); } // 存储图片路径的核心属性 public string FullImagePath { get; set; } // 可选:记录路径存入时间(默认UTC时间) public DateTime CreatedTime { get; set; } = DateTime.UtcNow; }
编写存储方法
复用你已有的CloudStorageAccount实例来创建表存储客户端,完成插入操作:
// 注意:cloudStorageAccount是你之前获取的存储账户实例,可直接复用 private async Task StoreImagePathToTable(string imagePath) { // 创建表存储客户端 CloudTableClient tableClient = cloudStorageAccount.CreateCloudTableClient(); // 指定要操作的表名(不存在则自动创建) CloudTable imageTable = tableClient.GetTableReference("ImagePathRecords"); await imageTable.CreateIfNotExistsAsync(); // 构造实体并赋值 var imageRecord = new ImagePathRecord { FullImagePath = imagePath }; // 执行插入操作 TableOperation insertOp = TableOperation.Insert(imageRecord); await imageTable.ExecuteAsync(insertOp); }
3. 整合到你的现有上传流程
如果你想在图片上传完成后立刻把路径存入表存储,可以直接在上传代码后面添加调用:
// 你的现有上传代码... string imageName = Guid.NewGuid().ToString() + ".png"; // 替换成你的图片后缀 CloudFile targetFile = rootDir.GetFileReference(imageName); // 这里替换成你的实际上传逻辑(比如从本地文件流/内存流上传) using (var localFileStream = File.OpenRead(@"C:\local-image.png")) { await targetFile.UploadFromStreamAsync(localFileStream); } // 上传完成后,直接存储路径到表存储 await StoreImagePathToTable(targetFile.Uri.ToString());
一些注意事项
- 权限检查:确保你的存储账户连接字符串拥有文件共享的
读取权限和表存储的写入权限 - 异常处理:建议给文件遍历和表存储操作添加
try-catch块,处理网络异常、权限不足等情况 - 性能优化:如果文件共享里有大量图片,建议用
ListFilesAndDirectoriesSegmentedAsync分页获取文件列表,避免一次性加载过多数据
内容的提问来源于stack exchange,提问作者AskMe
相关产品推荐
相关产品推荐

