如何在Azure函数中获取HTML表单中的用户邮箱值?
如何在Azure Blob触发函数中获取用户邮箱值
针对你的场景,有三种可靠的方案可以让Blob触发函数获取到用户邮箱,以下是具体实现:
方案1:将邮箱存储为Blob自定义元数据
这是最直接的方式,上传文件时把邮箱添加到Blob的元数据中,触发函数通过绑定自动读取元数据。
.NET Core MVC上传代码
在表单提交的Action中,上传文件时添加邮箱元数据:
[HttpPost] public async Task<IActionResult> Upload(IFormFile file, string userEmail) { if (file == null || file.Length == 0) return BadRequest("请选择要上传的文件"); var blobServiceClient = new BlobServiceClient("你的Azure Blob连接字符串"); var containerClient = blobServiceClient.GetBlobContainerClient("目标容器名"); await containerClient.CreateIfNotExistsAsync(); // 生成唯一Blob名称 var blobName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; var blobClient = containerClient.GetBlobClient(blobName); // 添加邮箱到Blob元数据 var metadata = new Dictionary<string, string> { { "UserEmail", userEmail } }; await blobClient.SetMetadataAsync(metadata); // 上传文件 using (var stream = file.OpenReadStream()) { await blobClient.UploadAsync(stream, overwrite: true); } return RedirectToAction("UploadSuccess"); }
Blob触发函数代码
函数通过IDictionary<string, string> metadata绑定获取Blob元数据:
public static class BlobEmailNotificationFunction { [FunctionName("BlobEmailNotificationFunction")] public static async Task Run( [BlobTrigger("目标容器名/{name}", Connection = "AzureWebJobsStorage")] Stream blobStream, string name, IDictionary<string, string> metadata, ILogger log) { log.LogInformation($"处理Blob: {name},大小: {blobStream.Length}字节"); // 提取邮箱值 if (metadata.TryGetValue("UserEmail", out string userEmail)) { log.LogInformation("准备发送邮件到: " + userEmail); // 这里添加你的邮件发送逻辑,比如调用SendGrid或SMTP服务 // await SendNotificationEmail(userEmail); } else { log.LogWarning("未找到用户邮箱元数据"); } } }
方案2:将邮箱与Blob名称关联存储到Azure Table Storage
如果不想修改Blob元数据,可以在上传时把Blob名称和邮箱的对应关系存入Table Storage,函数触发后根据Blob名称查询邮箱。
MVC上传时写入Table Storage
[HttpPost] public async Task<IActionResult> Upload(IFormFile file, string userEmail) { // 省略Blob上传逻辑... var blobName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; var blobClient = containerClient.GetBlobClient(blobName); await blobClient.UploadAsync(stream, overwrite: true); // 写入Table Storage关联数据 var tableServiceClient = new TableServiceClient("你的Table Storage连接字符串"); var tableClient = tableServiceClient.GetTableClient("BlobEmailMappings"); await tableClient.CreateIfNotExistsAsync(); var mappingEntity = new BlobEmailMapping(blobName, userEmail); await tableClient.AddEntityAsync(mappingEntity); return RedirectToAction("UploadSuccess"); } // 定义Table实体类 public class BlobEmailMapping : ITableEntity { public BlobEmailMapping() { } public BlobEmailMapping(string blobName, string email) { PartitionKey = "BlobEmail"; RowKey = blobName; UserEmail = email; } public string PartitionKey { get; set; } public string RowKey { get; set; } public string UserEmail { get; set; } public DateTimeOffset? Timestamp { get; set; } public ETag ETag { get; set; } }
Blob触发函数查询Table Storage
public static class BlobEmailNotificationFunction { [FunctionName("BlobEmailNotificationFunction")] public static async Task Run( [BlobTrigger("目标容器名/{name}", Connection = "AzureWebJobsStorage")] Stream blobStream, string name, ILogger log) { log.LogInformation($"处理Blob: {name}"); // 查询Table获取邮箱 var tableServiceClient = new TableServiceClient("你的Table Storage连接字符串"); var tableClient = tableServiceClient.GetTableClient("BlobEmailMappings"); var mappingEntity = await tableClient.GetEntityAsync<BlobEmailMapping>("BlobEmail", name); if (mappingEntity != null) { string userEmail = mappingEntity.Value.UserEmail; log.LogInformation("准备发送邮件到: " + userEmail); // 执行邮件发送逻辑 } } }
方案3:将邮箱编码到Blob文件名中
把邮箱进行URL编码后拼到Blob文件名里,函数触发后解析文件名提取邮箱。
MVC上传时生成带邮箱的文件名
[HttpPost] public async Task<IActionResult> Upload(IFormFile file, string userEmail) { // 对邮箱编码,避免特殊字符干扰文件名 string encodedEmail = Uri.EscapeDataString(userEmail); var blobName = $"{encodedEmail}_{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; var blobServiceClient = new BlobServiceClient("你的Azure Blob连接字符串"); var containerClient = blobServiceClient.GetBlobContainerClient("目标容器名"); var blobClient = containerClient.GetBlobClient(blobName); using (var stream = file.OpenReadStream()) { await blobClient.UploadAsync(stream, overwrite: true); } return RedirectToAction("UploadSuccess"); }
Blob触发函数解析文件名
public static class BlobEmailNotificationFunction { [FunctionName("BlobEmailNotificationFunction")] public static void Run( [BlobTrigger("目标容器名/{name}", Connection = "AzureWebJobsStorage")] Stream blobStream, string name, ILogger log) { log.LogInformation($"处理Blob: {name}"); // 解析文件名提取邮箱 string[] nameParts = name.Split('_', 2); if (nameParts.Length >= 1) { string userEmail = Uri.UnescapeDataString(nameParts[0]); log.LogInformation("准备发送邮件到: " + userEmail); // 执行邮件发送逻辑 } } }
内容的提问来源于stack exchange,提问作者Vova
相关产品推荐
相关产品推荐

