C# HttpClient上传文件到服务器(multipart/form-data)

using (HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false }))//若想手动设置Cookie则必须设置UseCookies = false
{
                               
    string boundary = string.Format("----Boundary{0}",DateTime.Now.Ticks.ToString("x"));
 
    MultipartFormDataContent content = new MultipartFormDataContent(boundary);
 
    #region 设置请求参数
 
    content.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
    content.Headers.Add("Cookie", "对应的Cookie");
 
    #endregion
 
    if (string.IsNullOrEmpty(fullPath) && !File.Exists(fullPath))
    {
        return false;
    }
 
    string fileName = Path.GetFileName(fullPath);
 
    #region Stream请求
 
    FileStream fStream = File.Open(fullPath, FileMode.Open, FileAccess.Read);
 
    content.Add(new StreamContent(fStream, (int)fStream.Length), "file", fileName);
                
    #endregion
 
    content.Add(new StringContent(JsonHelper.Serialize(entity)), "dtoStr");
              
    var result = client.PostAsync(reqUrl, content).Result;
 
    try
    {
        if (result.IsSuccessStatusCode)
        {
            string rslt = result.Content.ReadAsStringAsync().Result;
 
            Debug.WriteLine(rslt);
 
            return true;
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(string.Format("获取服务器返回结果错误:消息:{0},堆栈:{1}",ex.Message,ex.StackTrace));
    }
    finally
    {
        //关闭文件流
        fStream.Close();
        client.Dispose();
    }                
 }

C# HttpClient上传文件到服务器(multipart/form-data)_ZHENG-CSDN博客

接手了一个需求,将文件上传到服务器中,参考了上面博客的内容,但是发现有一些问题,总结一下:

关于边界值boundary的问题:

先说这个boundary是什么,可以把它当成边界值,分隔符,通过分隔符可以区分出不同的参数。

按照如上的方法,添加了boundary,但是发现不好用,通过Fildder抓包看了一下,此时的Content-Type=multipart/form-data,但是我用PostMan发送相同的请求是成功的,看到PostMan里的Content-Type参数是Content-Type= multipart/form-data; boundary=<calculated when request is sent>,感觉需要在Conten-Type中带有boundary的信息,然后我是这么设置的:

string boundary = "----Boundary" + DateTime.Now.Ticks.ToString("x");
content.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);

同时这时候鬼使神差的把

MultipartFormDataContent content = new MultipartFormDataContent(boundary);

MultipartFormDataContent构造函数的boundary给删除了。

改完如上代码后,再次运行,依旧报错,看了下错误信息,是"Cannot add value because header 'Content-Type' does not support multiple values.",

于是在添加之前清空了一下Content-Type

content.Headers.Remove("Content-Type");
content.Headers.TryAddWithoutValidation("Content-Type", "multipart/form-data; boundary=" + boundary);

再调试的时候 ,通过Fiddler抓包,发现此时的hearder中的

Content-Type: multipart/form-data; boundary=---Boundary8d98e4bf0131670

这时候达到预期了,但是请求依旧有问题,百思不得其解时,再看Fildder,发现请求体中,也有一串分割符,但并不是Content-Type中的boundary,而是由数字组成的,这时候就回想到,可能是由于Content-Type中的分割符与请求提中的分隔符不一致导致的。重新给MultipartFormDataContent传入boundary,问题解决。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值