如何为Azure Blob Storage中的文件设置过期时间以实现自动删除?
我想用ASP.NET Core代码将文件上传到Azure Blob Storage,并设置过期时间,让文件在X天后自动删除。目前上传文件的代码能正常运行,但设置保留期时遇到错误:The metadata specified is invalid. It has characters that are not permitted。
上传及尝试设置保留期的代码如下:
[HttpPost("UploadFile")] public async Task<IActionResult> UploadFile([FromForm] IFormFile file) { if (file == null || file.Length <= 0) return BadRequest("File is required."); try { // 创建唯一文件名避免冲突 string fileName = Guid.NewGuid().ToString() + "_" + file.FileName; // 上传文件到Azure Blob Storage BlobServiceClient blobServiceClient = new BlobServiceClient(_connectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(_containerName); BlobClient blobClient = containerClient.GetBlobClient(fileName); using (var stream = file.OpenReadStream()) { await blobClient.UploadAsync(stream, overwrite: true); } // 尝试为Blob设置30天保留期(此处报错) var metadata = new Dictionary<string, string> { { "retention-days", "30" } }; await blobClient.SetMetadataAsync(metadata); return Ok("File uploaded successfully."); } catch (Exception ex) { return StatusCode(500, $"An error occurred: {ex.Message}"); } }
我还尝试了另一种写法,但同样报错:
BlobProperties properties = await blobClient.GetPropertiesAsync(); properties.Metadata.Add("retention-days", "30"); await blobClient.SetMetadataAsync(properties.Metadata);
核心问题:如何确保Azure Blob Storage中的文件能在X天后自动删除?
1. 元数据报错原因及修复
报错是因为Azure Blob元数据的键名不允许包含连字符(-),仅支持字母、数字、下划线(_)或驼峰式命名。将retention-days改为retention_days或retentionDays即可解决元数据报错,但元数据仅用于存储自定义标记,不会触发自动删除操作。
2. 实现自动删除的两种正确方式
要让Blob自动删除,需使用Azure官方支持的两种方案:
方法一:上传时直接设置Blob过期删除属性
在上传Blob时,通过BlobUploadOptions配置DeleteAfter或ExpiresOn属性,指定自动删除的时间,Azure会在到期时自动清理该Blob。修改后的代码如下:
[HttpPost("UploadFile")] public async Task<IActionResult> UploadFile([FromForm] IFormFile file) { if (file == null || file.Length <= 0) return BadRequest("File is required."); try { string fileName = Guid.NewGuid().ToString() + "_" + file.FileName; BlobServiceClient blobServiceClient = new BlobServiceClient(_connectionString); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(_containerName); BlobClient blobClient = containerClient.GetBlobClient(fileName); // 配置上传选项,设置30天后自动删除 var uploadOptions = new BlobUploadOptions { HttpHeaders = new BlobHttpHeaders { ContentType = file.ContentType // 可选:设置文件内容类型 }, // 两种方式二选一: DeleteAfter = TimeSpan.FromDays(30) // 从Blob创建时间起,30天后删除 // ExpiresOn = DateTimeOffset.UtcNow.AddDays(30) // 指定具体的过期时间 }; using (var stream = file.OpenReadStream()) { await blobClient.UploadAsync(stream, uploadOptions, overwrite: true); } return Ok("File uploaded successfully with auto-delete set."); } catch (Exception ex) { return StatusCode(500, $"An error occurred: {ex.Message}"); } }
方法二:为容器设置生命周期管理策略
如果需要统一管理容器内所有Blob的过期规则(比如所有超过30天的Blob自动删除),可通过Azure Portal或CLI设置容器的生命周期规则:
- 登录Azure Portal,找到目标Blob存储账户
- 进入对应容器,点击「生命周期管理」
- 添加规则:设置规则名称,选择「删除Blob」动作,条件设为「Blob创建后超过30天」
- 保存规则后,Azure会定期扫描并自动删除符合条件的Blob
这种方式适合批量统一管理,无需在上传代码中单独配置。
3. 关键说明
自定义元数据仅用于存储额外信息,Azure不会基于元数据的值自动执行删除操作,必须使用上述两种官方方案才能实现自动删除逻辑。
内容的提问来源于stack exchange,提问作者OpenStack

