如何使用.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
相关产品推荐
相关产品推荐

