• .NET Core WebAPI 基础 文件上传


      昨天分享了一个在WebApi中如何接收参数的文章 传送门,然后有新人小伙伴就问了,那文件上传呢,这个怎么弄,借此我写了一个小demo,分享给大家。

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

    txt文件

    这是需要上传的txt文件。

    指定文件参数名

    代码

    复制代码
    [HttpPost("UploaFile")]
    public async Taskstring, string>> UploadFileAsync(IEnumerable 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 这个,因为我们上传的文件可能不止一个,所以这里使用了集合,要是不喜欢 IEnumerable,换成 List 也是可以的;

    不指定文件参数名

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

    代码

    复制代码
    [HttpPost("UploaFile2")]
    public async Taskstring, 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这些传参啦!

    代码

    复制代码
    [HttpPost("{method}/{value}/UploaFile")]
    public async Taskstring, object>> UploadFileAsync(
        [FromRoute] Parameter route,
        [FromQuery] Parameter query,
        [FromForm] Parameter form,
        IEnumerable 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;
    }
    复制代码

    示例

     关于文件上传,在微软的官网中也有对应的文档,感兴趣的小伙伴可以去看看,传送门,感谢各位的阅读,有任何问题欢迎评论区留言!

  • 相关阅读:
    vuecli配置sass
    联合教育部高等学校科学研究发展中心,阿依瓦科技创新教育专项正式发布!
    网络安全(黑客)——自学2024
    在ESG领域,区块链究竟怎么用?
    联想小新如果使用蓝牙鼠标在关闭了触摸板的情况下不小心关掉了蓝牙该如何处理?
    Grpc快速实践
    【重拾C语言】六、批量数据组织(三)数组初值;字符串、字符数组、字符串数组;类型定义 typedef
    2311rust,到50版本更新
    徐州存储服务器会应用在哪些场景?
    UE4 C++联网RPC教程笔记(三)(第8~9集)完结
  • 原文地址:https://www.cnblogs.com/ysmc/p/17666170.html