如何使用C# .NET在Azure中修改用户上传的.csv文件并生成链接?
使用C# .NET处理Azure存储中的CSV文件并生成访问链接
以下是完整的实现流程,包含CSV列处理、Azure Blob存储操作和访问链接生成的核心代码:
1. 准备依赖
首先在Azure Functions项目中安装必要的NuGet包:
Azure.Storage.Blobs:用于Azure Blob存储的操作CsvHelper:用于高效读写CSV文件(处理列操作更便捷)
可以通过Package Manager控制台安装:
Install-Package Azure.Storage.Blobs Install-Package CsvHelper
2. 核心实现代码
定义CSV数据模型
先创建对应原CSV列的模型,以及处理后的扩展模型:
public class OriginalCsvRecord { public string Slashtag { get; set; } public string URL { get; set; } } public class ModifiedCsvRecord : OriginalCsvRecord { public string NewColumn { get; set; } // 新增的第三列 }
处理CSV并重新存储的函数逻辑
假设你的Azure函数已经能接收上传的CSV并存储到input-container容器,以下是处理函数的核心代码:
using Azure.Storage.Blobs; using Azure.Storage.Blobs.Specialized; using Azure.Storage.Sas; using CsvHelper; using CsvHelper.Configuration; using System.Globalization; using System.IO; public static async Task<string> ProcessCsvAndGenerateLink(string inputBlobName, string connectionString) { // 1. 初始化Blob客户端 var blobServiceClient = new BlobServiceClient(connectionString); var inputContainerClient = blobServiceClient.GetBlobContainerClient("input-container"); var outputContainerClient = blobServiceClient.GetBlobContainerClient("output-container"); // 存储修改后的文件 await outputContainerClient.CreateIfNotExistsAsync(); // 2. 读取原CSV内容 var inputBlobClient = inputContainerClient.GetBlobClient(inputBlobName); using var inputStream = new MemoryStream(); await inputBlobClient.DownloadToAsync(inputStream); inputStream.Position = 0; // 3. 处理CSV:添加第三列并填充数据 using var reader = new StreamReader(inputStream); using var csvReader = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture)); var originalRecords = csvReader.GetRecords<OriginalCsvRecord>().ToList(); var modifiedRecords = originalRecords.Select(record => new ModifiedCsvRecord { Slashtag = record.Slashtag, URL = record.URL, NewColumn = GenerateNewColumnValue(record.Slashtag, record.URL) // 自定义填充逻辑 }).ToList(); // 4. 将修改后的数据写入新的CSV流 using var outputStream = new MemoryStream(); using var writer = new StreamWriter(outputStream); using var csvWriter = new CsvWriter(writer, new CsvConfiguration(CultureInfo.InvariantCulture)); csvWriter.WriteRecords(modifiedRecords); await writer.FlushAsync(); outputStream.Position = 0; // 5. 上传修改后的CSV到Azure存储 var outputBlobName = $"modified_{inputBlobName}"; var outputBlobClient = outputContainerClient.GetBlobClient(outputBlobName); await outputBlobClient.UploadAsync(outputStream, overwrite: true); // 6. 生成访问链接(使用SAS令牌,有效期可自定义) var sasBuilder = new BlobSasBuilder() { BlobContainerName = outputContainerClient.Name, BlobName = outputBlobName, Resource = "b", // 指定为Blob资源 ExpiresOn = DateTimeOffset.UtcNow.AddHours(24) // 链接有效期24小时 }; sasBuilder.SetPermissions(BlobSasPermissions.Read); // 仅赋予读取权限 var sasToken = sasBuilder.ToSasQueryParameters(new StorageSharedKeyCredential(blobServiceClient.AccountName, GetAccountKey(connectionString))).ToString(); var accessUrl = $"{outputBlobClient.Uri}?{sasToken}"; return accessUrl; } // 自定义第三列数据填充逻辑示例 private static string GenerateNewColumnValue(string slashtag, string url) { // 这里可以根据业务需求自定义,比如拼接Slashtag和URL的哈希值、生成短链等 return $"{slashtag}_processed_{Uri.EscapeDataString(url.Substring(0, Math.Min(url.Length, 20)))}"; } // 从连接字符串中提取存储账户密钥(也可以通过Azure AD身份验证替代) private static string GetAccountKey(string connectionString) { var parts = connectionString.Split(';'); foreach (var part in parts) { if (part.StartsWith("AccountKey=", StringComparison.OrdinalIgnoreCase)) { return part.Substring("AccountKey=".Length); } } throw new InvalidOperationException("无法从连接字符串中提取账户密钥"); }
3. 关键说明
- CSV处理:使用CsvHelper可以避免手动解析CSV的繁琐,同时支持灵活的列映射和数据转换,处理带引号、逗号等特殊字符的CSV更可靠。
- Azure存储权限:生成SAS令牌时,建议仅赋予必要的权限(如
Read),并设置合理的有效期,避免安全风险。如果你的场景允许,也可以使用Azure AD身份验证生成链接,无需共享密钥。 - 错误处理:实际生产环境中需要添加异常捕获(如Blob不存在、CSV格式错误等),并返回友好的错误信息。
- 容器配置:确保
output-container容器的访问策略配置正确,若需要公开访问,可设置容器为Blob匿名访问,但SAS令牌方式更安全可控。
内容的提问来源于stack exchange,提问作者kamran bajwa
相关产品推荐
相关产品推荐

