昨天分享了一个在WebApi中如何接收参数的文章 .NET API 中的 FromRoute、FromQuery、FromBody 用法 - 一事冇诚 - 博客园 (cnblogs.com),然后有新人小伙伴就问了,那文件上传呢,这个怎么弄,借此我写了一个小demo,分享给大家。
通常来说,上传文件,我们是使用POST,还是老规矩先上代码:
这是需要上传的txt文件。
[HttpPost("UploaFile")]
public async Task
{
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
而在实际开发中,我们可能会碰到前端不配合,或者参数名改来改去,我们后端又不想频繁更改,那怎么办呢,此时我们可以使用以下的方法,不过我个人不太建议,还是好好沟通的好,不然别人看到你的接口文档,例如swagger,都不知道你这个接口是上传文件的。
[HttpPost("UploaFile2")]
public async Task
{
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
[FromRoute] Parameter route,
[FromQuery] Parameter query,
[FromForm] Parameter form,
IEnumerable
{
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;
}
关于文件上传,在微软的官网中也有对应的文档,感兴趣的小伙伴可以去看看,传送门
手机扫一扫
移动阅读更方便
你可能感兴趣的文章