前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET Core WebAPI 基础文件上传

.NET Core WebAPI 基础文件上传

作者头像
郑子铭
发布2023-09-19 13:32:14
3380
发布2023-09-19 13:32:14
举报

前言

通常来说,上传文件,我们是使用POST,还是老规矩先上代码

txt文件

这是需要上传的txt文件。

指定文件参数名

代码

代码语言:javascript
复制
[HttpPost("UploaFile")]
public async Task<Dictionary<string, string>> UploadFileAsync(IEnumerable<IFormFile> files)
{
    var fileStream = files.FirstOrDefault()?.OpenReadStream();
    var fileContent = new StringBuilder();
    if (fileStream != null)
    {
        using var reader = new StreamReader(fileStream!);
        while (reader.Peek() >= 0)
        {
            fileContent.AppendLine(await reader.ReadLineAsync());
        }
    }

    var result = new Dictionary<string, string>()
    {
        ["fileContent"] = fileContent.ToString()
    };

    return result;
}
调用示例

这里有一个需要注意的地方,就是上传文件的参数名,需要跟接口的入参名一致,也就是 files,我们使用的类型为 IEnumerable< IFormFile>,主要是 IFormFile 这个,因为我们上传的文件可能不止一个,所以这里使用了集合,要是不喜欢 IEnumerable,换成 List 也是可以的;

不指定文件参数名

而在实际开发中,我们可能会碰到前端不配合,或者参数名改来改去,我们后端又不想频繁更改,那怎么办呢,此时我们可以使用以下的方法,不过我个人不太建议,还是好好沟通的好,不然别人看到你的接口文档,例如swagger,都不知道你这个接口是上传文件的。

代码

代码语言:javascript
复制
[HttpPost("UploaFile2")]
public async Task<Dictionary<string, string>> UploadFile2Async()
{            
    var fileStream = HttpContext.Request.Form.Files.FirstOrDefault()?.OpenReadStream();
    var fileContent = new StringBuilder();
    if (fileStream != null)
    {
        using var reader = new StreamReader(fileStream!);
        while (reader.Peek() >= 0)
        {
            fileContent.AppendLine(await reader.ReadLineAsync());
        }
    }

    var result = new Dictionary<string, string>()
    {
        ["fileContent"] = fileContent.ToString()
    };

    return result;
}
示例

可以看到,结果是一样的。

混合

而同样是一个POST请求,自然是可以通过url,route,from这些传参啦!

代码

代码语言:javascript
复制
[HttpPost("{method}/{value}/UploaFile")]
public async Task<Dictionary< string, object >> UploadFileAsync(
    [FromRoute] Parameter route,
    [FromQuery] Parameter query,
    [FromForm] Parameter form,
    IEnumerable<IFormFile> files)
{
    var fileStream = files.FirstOrDefault()?.OpenReadStream();
    var fileContent = new StringBuilder();
    if (fileStream != null)
    {
        using var reader = new StreamReader(fileStream!);
        while (reader.Peek() >= 0)
        {
            fileContent.AppendLine(await reader.ReadLineAsync());
        }
    }

    var result = new Dictionary<string, object>()
    {
        ["route"] = route,
        ["query"] = query,
        ["form"] = form,
        ["fileContent"] = fileContent.ToString()
    };

    return result;
}

示例

关于文件上传,在微软的官网中也有对应的文档,感兴趣的小伙伴可以去看看https://learn.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-7.0&WT.mc_id=DT-MVP-5005089

推荐阅读:

一份阅读量突破10万+的C#/.NET/.NET Core面试宝典(基础版)

【微信自动化】使用c#实现微信自动化

细聊C# AsyncLocal如何在异步间进行数据流转

从未来看C#!

.NET 7+Vue 前后端分离框架Admin.Core

由浅到深 谈.NET的Async、Await关键字

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-11 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指定文件参数名
  • 代码
    • 调用示例
      • 示例
      • 示例
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档