HttpClient
和MultipartFormDataContent
(传送门)最低适用于.NET Framework 4.5版本
发送端代码
| using (HttpClient client = new HttpClient()) |
| { |
| var content = new MultipartFormDataContent(); |
| |
| content.Add(new StringContent("123456"), "qq"); |
| |
| string path = Path.Combine(System.Environment.CurrentDirectory, "1.png"); |
| |
| content.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(path)), "file", "123.png"); |
| |
| var requestUri = "http://192.168.1.108:56852/api/Test/SaveFile"; |
| var result = client.PostAsync(requestUri, content).Result.Content.ReadAsStringAsync().Result; |
| |
| Console.WriteLine(result); |
| } |
接收端代码
| [HttpPost] |
| public async Task<JsonResult> SaveFile([FromForm]string qq, IFormFile file) |
| { |
| return await Task.Run(() => |
| { |
| try |
| { |
| |
| var filefullPath = Path.Combine(Directory.GetCurrentDirectory(), file.FileName); |
| using (FileStream fs = new FileStream(filefullPath, FileMode.Create)) |
| { |
| file.CopyTo(fs); |
| fs.Flush(); |
| } |
| } |
| catch (Exception ex) |
| { |
| return Fail(file.FileName + "---" + ex.Message); |
| } |
| return Success(); |
| }); |
| } |
| |
注意:如果要通过参数形式接收数据,需要确保参数名称和上面发送请求中设置的名称一致,否则无法自动绑定到参数中,且需要给参数加上[FromForm]
的标记。
使用model对象接收数据
| public class SaveFileModel |
| { |
| public string qq { get; set; } |
| public IFormFile File { get; set; } |
| } |
| public async Task<JsonResult> SaveFile([FromForm]SaveFileModel model) |
| { |
| |
| } |
使用HttpContext从请求的Form中获取数据
| public async Task<JsonResult> SaveFile() |
| { |
| return await Task.Run(() => |
| { |
| var files = HttpContext.Request.Form.Files; |
| var qq = HttpContext.Request.Form["qq"]; |
| |
| }); |
| } |
总结
这个问题是在写一个.Net Core
项目时遇到的,以前在.Net Framework 4.0
的时候,使用string
拼接表单中文件的内容,到处都是boundary
分界线。用MultipartFormDataContent
来进行表单提交上传文件是它内部帮我们拼接了这个复杂的内容。(可以用Fiddler
抓一下请求看看)emm...我去找一下当初是怎么弄的文件上传,如果有再更新此文。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步