昨天分享了一个在WebApi中如何接收参数的文章 .NET API 中的 FromRoute、FromQuery、FromBody 用法 - 一事冇诚 - 博客园 (cnblogs.com),然后有新人小伙伴就问了,那文件上传呢,这个怎么弄,借此我写了一个小demo,分享给大家。

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

txt文件

这是需要上传的txt文件。

指定文件参数名

代码

[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,都不知道你这个接口是上传文件的。

代码

[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这些传参啦!

代码

[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;
}

示例

关于文件上传,在微软的官网中也有对应的文档,感兴趣的小伙伴可以去看看,传送门

.NET Core WebAPI 基础 文件上传的更多相关文章

  1. ASP.NET Core 中的文件上传

    ASP.NET Core上传文件 ASP.NET Core使用IFormFile来读取上传的文件内容,然后将数据写入到磁盘或其它存储空间. 添加FileUpload模型,用来接收上传的文件内容. pu ...

  2. .Net Core实现将文件上传到七牛云存储

    功能:将图片上传到七牛云存储 准备工作 注册七牛账号,提交实名认证(基本上1天内内审核通过) 登录七牛后台->对象存储->新建空间 (基本概念:https://developer.qini ...

  3. webAPI+angularJS文件上传和下载

    开发框架 前端 angularJS1.6 下载和保存文件FileSaver:https://github.com/eligrey/FileSaver.js/ 后端 .net WebAPI 1 导入Ex ...

  4. asp.net webapi 多文件上传

    使用enctype="multipart/form-data"来进行操作 /// <summary> /// 上传图片 /// </summary> /// ...

  5. 循序渐进学.Net Core Web Api开发系列【5】:文件上传

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍通 ...

  6. 解决ASP.NET Core Mvc文件上传限制问题

    一.简介 在ASP.NET Core MVC中,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config我们应该如何下手呢? 二.设置上传 ...

  7. 用VSCode开发一个asp.net core2.0+angular5项目(5): Angular5+asp.net core 2.0 web api文件上传

    第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.html 第三 ...

  8. fastdfs-client-java 文件上传

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...

  9. asp.net core webapi文件上传

    最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库.最先来的问题就是上传文件的问题. POST文件的一些坑 使用默认模板创建webapi ...

  10. .net core webapi 文件上传在 Swagger 文档中的有好提示处理

    前提: 需要nuget   Swashbuckle.AspNetCore 我暂时用的是  4.01 最新版本: 描述:解决 .net core webapi 上传文件使用的是 IFormFile,在S ...

随机推荐

  1. vue全家桶进阶之路5:DOM文档对象模型

    一.DOM对象 DOM,全称"DocumentObjectModel(文档对象模型)",它是由W3C组织定义的一个标准. 在前端开发时,我们往往需要在页面某个地方添加一个元素或者删 ...

  2. Golang指针隐式间接引用

    1.Golang指针 在介绍Golang指针隐式间接引用前,先简单说下Go 语言的指针 (Pointer),一个指针可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个 ...

  3. Vue cli3 整合SuperMap巧遇js异步加载的坑

    最近使用到superMap做三维地图,而项目又分为可视化大屏与后台管理系统两部分,所以项目配置了多入口,然引入cesium依赖就成了问题,在vue cli3 整合Cesium,处理build 时内存溢 ...

  4. 查看svn本地账户和密码

    最近由于抗击疫情需要远程办公,协同就必不可少了,都知道svn一般公司都是走内网,然而目前要连接公司svn就得重新指定地址,今日在重新指定时然我,输入用户名和密码一下子蒙了,平时一旦连接后就不需要再次输 ...

  5. Win10环境配置(一)——C\C++篇

    Win10环境配置(一)--C\C++篇 1.工具准备 官网下载地址:https://sourceforge.net/projects/mingw-w64/ MinGW64下载地址:https://s ...

  6. 10 款 VS Code 插件神器,第 7 款超级实用!

    VS Code 是这两年非常热门的一款 IDE,它不仅有提升开发体验的界面.轻量化的编辑器,还有丰富而强大的插件,这些优秀的插件使得 VS Code 生态体系更加吸引人,让开发效率大大提升.本文来介绍 ...

  7. 曲线艺术编程 coding curves 第十一章 玫瑰花形( ROSES)

    第十一章 玫瑰花形 ROSES 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗(sheldo ...

  8. 前后端是怎么交互的呢?(Jvav版)

    一.什么是前端 在网上,我也去找了一些观点,其实都是应用层面的,什么使用一个地址,回车以后就能拿到 .html文件等等 说的也没问题,前端简单点说呢,就是负责展示和美化的页面,大部分在网上我们所看到的 ...

  9. harbor 搭建和部署

    Docker官方的Docker Registry镜像,可以用来储存和分发Docker镜像.不过实在不昨的,仅仅能储存和分发镜像,也不提供UI,你还得自己找一个过时的UI搭建,受限制于Docker Re ...

  10. Mysql基础篇(四)之事务

    一. 事务简介 事务是一组操作的集合,它是一个不可分隔的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 就比如:张三给李四转账1000块钱 ...