在 netcore 3中,Get参数上传自不必说了。post,且上传文件呢?
dotnet new webapi --no-https
注意:控制器属性[ApiController],继承自ControllerBase
[ApiController]
[Route("[controller]")]
public class DataController : ControllerBase
{
private readonly IWebHostEnvironment _env;
public DataController(IWebHostEnvironment env) {
_env = env;
}
//...
}
前端加wwwroot/up.html
<style>
.d1{width:800px;margin:60px auto;line-height:2;}
</style>
<form method="post" enctype="multipart/form-data" action="/data">
<div class="d1">
<p>本form上传3个文本字段,2个file:</p>
文件1:<input type="file" name="f1" /><br>
文件2:<input type="file" name="f2" /><br>
用户:<input type="text" name="uID" /><br>
姓名:<input type="text" name="uXM" /><br>
密码:<input type="password" name="pwd" />
<hr>
<input type="submit" value="上传post" />
</div>
</form>
五个带name的input,form的method为post…
控制器DataController.cs中
方法一
[HttpPost]
public IActionResult post()
{
var re = Request.Form; //取全部post过来的参数
var uid = re["uid"].ToString();
var uxm = re["uxm"].ToString();
var pwd = re["pwd"].ToString();
var files = re.Files;
long size = files.Sum(f => f.Length);
return Ok(new { fcount = files.Count, fsize=size, uid, uxm, pwd });
}
可见 Request.Form 能取全部post过来的参数,函数名后的括号中不能有形参的。
方法二
[HttpPost]
public object post([FromForm] IFormCollection re)
{
var uid = re["uid"].ToString();
var uxm = re["uxm"].ToString();
var pwd = re["pwd"].ToString();
var files = re.Files;
var ar = new System.Collections.ArrayList();
var p3 = Path.Combine(_env.WebRootPath, @"dnFile");//注入的环境变量,取路径
if (!Directory.Exists(p3)) { Directory.CreateDirectory(p3); }
foreach (var af in files)
{
if (af.Length < 1) continue;
ar.Add(new { fname = af.FileName, fsize = af.Length });
//var _fName = NewGuid().ToString() + Path.GetExtension(af.FileName);
var _fName = af.FileName;
var pf = Path.Combine(p3, _fName);
using var fs = new FileStream(pf, FileMode.Create);//c#8.0
af.CopyTo(fs);
}
return new { ffs = ar, uid, uxm, pwd };
}
用 [FromForm] IFormCollection re 取全部过来的参数,一个集合类形参。
至于[FormBody],上面两法够用,就不想学习了。
应该在startup.cs的Configure中包含:
app.UseDefaultFiles().UseStaticFiles();
运行:dotnet run
访问:localhost:5000/up.html
浏览文件、填写参数,post上传,可以肯定,上传的参数及文件都能取到了!
【End】2019-11-10