• C#使用HttpClient上传文件并附带其他参数


    HttpClientMultipartFormDataContent传送门)最低适用于.NET Framework 4.5版本

    发送端代码

    using (HttpClient client = new HttpClient())
    {
        var content = new MultipartFormDataContent();
        //添加字符串参数,参数名为qq
        content.Add(new StringContent("123456"), "qq");
    
        string path = Path.Combine(System.Environment.CurrentDirectory, "1.png");
        //添加文件参数,参数名为files,文件名为123.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...我去找一下当初是怎么弄的文件上传,如果有再更新此文。

  • 相关阅读:
    RabbitMQ知识梳理
    feign.FeignException: status 400 reading
    rabbitmq监控之消息确认ack
    Docker 安装redis mysql rabbitmq
    linux搭建GitLab
    杀死服务进程并重新启动,同时监听日志打印
    MySQL数据库连接报错
    idea: unable to import maven project
    线程池ThreadPool实战
    【2-SAT】URAL
  • 原文地址:https://www.cnblogs.com/cplemom/p/11264040.html
Copyright © 2020-2023  润新知