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

.NET Core Web API中使用IFormFile上传Excel(.xlsx)文件至Azure文件共享的实现方案咨询

在.NET Core Web API中实现Excel文件上传至Azure文件共享

没问题,我来一步步教你怎么实现这个需求,刚好你用的IFormFile完全适配这个场景,咱们一步步来:

1. 准备Azure文件共享环境

首先得在Azure那边搭好基础环境:

  • 登录Azure门户,创建一个存储账户(记得选合适的区域和性能层级)
  • 进入存储账户后,在左侧菜单找到「文件共享」,新建一个文件共享(比如命名为excel-uploads)
  • 回到存储账户的「访问密钥」页面,复制其中一个连接字符串,之后会用到

2. 安装必要的NuGet包

我们需要用Azure官方的文件存储SDK,在项目里安装Azure.Storage.Files.Shares包:

  • 通过NuGet包管理器搜索安装,或者用CLI命令:
dotnet add package Azure.Storage.Files.Shares

3. 配置Azure连接信息

在appsettings.json里添加Azure文件存储的配置,避免硬编码敏感信息:

"AzureFileStorage": {
  "ConnectionString": "你的Azure存储账户连接字符串",
  "ShareName": "你的文件共享名称"
}

4. 编写上传API控制器

创建一个API控制器,实现接收IFormFile并上传到Azure文件共享的逻辑:

using Azure.Storage.Files.Shares;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System.IO;
using System.Threading.Tasks;

[ApiController]
[Route("api/file-upload")]
public class FileUploadController : ControllerBase
{
    private readonly IConfiguration _config;

    // 通过构造函数注入配置
    public FileUploadController(IConfiguration config)
    {
        _config = config;
    }

    [HttpPost("excel")]
    public async Task<IActionResult> UploadExcelFile(IFormFile file)
    {
        // 第一步:验证文件是否有效
        if (file == null || file.Length == 0)
        {
            return BadRequest("请选择要上传的Excel文件");
        }

        // 第二步:验证文件格式是否为xlsx
        var isValidExcel = file.FileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) ||
                           file.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        if (!isValidExcel)
        {
            return BadRequest("仅支持上传.xlsx格式的Excel文件");
        }

        try
        {
            // 获取Azure配置信息
            var connString = _config["AzureFileStorage:ConnectionString"];
            var shareName = _config["AzureFileStorage:ShareName"];

            // 初始化ShareClient(连接到文件共享)
            var shareClient = new ShareClient(connString, shareName);
            await shareClient.CreateIfNotExistsAsync(); // 如果共享不存在则自动创建

            // 生成唯一文件名,避免重名覆盖
            var uniqueFileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
            // 获取文件客户端(指向共享中的目标文件)
            var fileClient = shareClient.GetRootDirectoryClient().GetFileClient(uniqueFileName);

            // 上传文件流到Azure
            await using var fileStream = file.OpenReadStream();
            await fileClient.UploadAsync(fileStream, overwrite: true);

            return Ok(new 
            { 
                Message = "Excel文件上传成功", 
                FileUri = fileClient.Uri.ToString(),
                FileName = uniqueFileName
            });
        }
        catch (Exception ex)
        {
            return StatusCode(StatusCodes.Status500InternalServerError, $"上传失败:{ex.Message}");
        }
    }
}

5. 额外注意事项

  • 文件大小限制:默认.NET Core对上传文件大小有限制,如果需要上传大文件,可以在Program.cs里配置:
builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 50 * 1024 * 1024; // 允许最大50MB的文件
});
  • 权限安全:不要把Azure连接字符串硬编码到代码里,建议用Azure Key Vault管理敏感信息;另外可以限制存储账户的访问权限,比如仅允许特定IP访问
  • 子目录上传:如果需要把文件传到共享里的子目录,只需要把GetRootDirectoryClient()换成GetDirectoryClient("your-subfolder")即可
  • 错误处理:可以捕获Azure SDK的特定异常(比如RequestFailedException),返回更精准的错误信息

这样就完成整个上传流程啦,你可以用Postman、Swagger或者前端表单调用POST api/file-upload/excel接口测试上传~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:28:14