You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:46:33