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

如何使用.NET Core 6 Minimal API POST上传PDF到Azure Blob Storage

.NET 6 Minimal API 实现PDF上传到Azure Blob Storage 实现方案

你已经完成连接字符串和环境变量配置的前提下,按以下步骤实现即可,全程使用Azure官方SDK,不需要额外第三方依赖。

前置准备

  • 安装Azure官方Blob存储SDK,在项目根目录执行以下命令:
    dotnet add package Azure.Storage.Blobs
    

完整实现代码

所有代码直接写在Program.cs中即可,不需要额外新增控制器。
首先在文件顶部引入必要命名空间:

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.AspNetCore.Server.Kestrel.Core;

核心业务逻辑代码:

var builder = WebApplication.CreateBuilder(args);

// 调整Kestrel请求体大小上限,默认值过小容易导致大PDF上传报错,这里设为100MB可按需修改
builder.Services.Configure<KestrelServerOptions>(opt =>
{
    opt.Limits.MaxRequestBodySize = 100 * 1024 * 1024;
});

var app = builder.Build();

// 读取你已经配置好的Blob连接字符串,环境变量、appsettings.json中配置的值会自动被加载
var blobConnStr = builder.Configuration.GetConnectionString("AzureBlobStorage")
    ?? throw new InvalidOperationException("Azure Blob连接字符串配置缺失");
// 定义存储PDF的容器名称,可替换为实际业务使用的容器名
const string targetContainer = "pdf-uploads";

// PDF上传接口
app.MapPost("/api/pdf/upload", async (IFormFile file) =>
{
    // 基础校验:空文件直接拦截返回
    if (file == null || file.Length == 0)
        return Results.BadRequest("未接收到有效上传文件");

    // 格式校验:同时校验扩展名和MIME类型,防止恶意文件修改后缀绕过校验
    var ext = Path.GetExtension(file.FileName).ToLowerInvariant();
    if (ext != ".pdf" || file.ContentType != "application/pdf")
        return Results.BadRequest("仅支持上传PDF格式文件");

    // 初始化Blob客户端实例
    var blobServiceClient = new BlobServiceClient(blobConnStr);
    var containerClient = blobServiceClient.GetBlobContainerClient(targetContainer);
    // 开发环境可保留这行自动创建不存在的容器,生产环境提前建好容器可删除该行
    await containerClient.CreateIfNotExistsAsync(PublicAccessType.None);

    // 生成唯一存储文件名,避免重名覆盖,同时规避用户上传文件名带特殊字符导致的存储异常
    var saveFileName = $"{Guid.NewGuid:N}{ext}";
    var blobClient = containerClient.GetBlobClient(saveFileName);

    // 执行文件流上传
    await using var readStream = file.OpenReadStream();
    await blobClient.UploadAsync(readStream, new BlobHttpHeaders
    {
        ContentType = "application/pdf"
    });

    return Results.Ok(new
    {
        SavedBlobName = saveFileName,
        OriginFileName = file.FileName,
        FileSize = file.Length
    });
})
.Accepts<IFormFile>("multipart/form-data")
.DisableAntiforgery(); // 非网页端API场景可关闭防伪验证,纯网页端调用建议删除该行保留默认校验

app.Run();

落地注意点

  • 配置项匹配:确认你环境变量中连接字符串的key为ConnectionStrings:AzureBlobStorage,如果自定义了key名,把代码里GetConnectionString的参数替换成你实际使用的key即可。
  • 权限校验:确认连接字符串对应的存储账号凭据,对目标容器拥有写入权限,否则上传时会抛出403权限错误。
  • 部署适配:如果用IIS部署服务,需要同步调整IIS请求过滤配置,将允许的请求体大小设置为和代码中一致,否则会报413请求过大错误。
  • 大文件场景:如果需要上传超过100MB的超大PDF,不要使用当前直传逻辑,替换为SDK自带的分块上传方法,传输稳定性更高。
  • 安全建议:生产环境不要长期使用账号密钥形式的连接字符串,替换为Azure托管身份认证,避免密钥泄露风险。

内容的提问来源于stack exchange,提问作者Harsh Shrivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 09:57:19