C# HttpClient上传文件并附带其它参数

1、Fiddler抓包参数详情

Content-Type: multipart/form-data; boundary="8d9ade1fd906a6a"
Content-Length: 39356

--8d9ade1fd906a6a
Content-Type: application/x-jpg
Content-Disposition: form-data; name=file; filename=test.jpg

...文件二进制流
--8d9ade1fd906a6a
Content-Disposition: form-data; name=toes

123@qq.com
--8d9ade1fd906a6a
Content-Disposition: form-data; name=subject

测试发送附件
--8d9ade1fd906a6a
Content-Disposition: form-data; name=Body

测试HttpClient发送文件+额外参数请求
--8d9ade1fd906a6a

2、使用MultipartFormDataContent封装文件和其它参数

上传文件时Content-Type是multipart/form-data,并且其它额外参数都要标识form-data

 2.1、把文件转成ByteArrayContent

        private static ByteArrayContent CreateByteArrayContent(string key, string fileName, string fileContent,
            byte[] fileBytes)
        {
            var fileByteArrayContent = new ByteArrayContent(fileBytes);
            fileByteArrayContent.Headers.ContentType = new MediaTypeHeaderValue(fileContent);
            fileByteArrayContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
            {
                Name = key, //接口匹配name
                FileName = fileName //附件文件名
            };
            return fileByteArrayContent;
        }

2.2、把其它附件参数转成ByteArrayContent

        private static List<ByteArrayContent> CreateParamsByteArrayContent(IDictionary<string, string> dic)
        {
            var list = new List<ByteArrayContent>();
            if (dic == null || dic.Count == 0) return list;
            foreach (var (key, value) in dic)
            {
                var valueBytes = Encoding.UTF8.GetBytes(value);
                var byteArray = new ByteArrayContent(valueBytes);
                byteArray.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    Name = key
                };
                list.Add(byteArray);
            }

            return list;
        }

2.3、构建MultipartFormDataContent

        private static MultipartFormDataContent CreateContent(byte[] bytes,IDictionary<string,string> addParams)
        {
            var strBoundary = DateTime.Now.Ticks.ToString("x"); //分隔符

            var resultContent = new MultipartFormDataContent(strBoundary);
            //文件
            var fileByteContent = CreateByteArrayContent("file", "test.jpg", "application/x-jpg", bytes);
            resultContent.Add(fileByteContent);
            //其它附加参数
            var paramsByteContent = CreateParamsByteArrayContent(addParams);
            paramsByteContent.ForEach(el =>
            {
                resultContent.Add(el);
            });
            return resultContent;
        }

3、发送请求

        static async Task Main(string[] args)
        {

            var dic = new Dictionary<string, string>
            {
                {"toes", "111@qq.com"},
                {"subject", "测试发送附件"},
                {"Body", "测试HttpClient发送文件+额外参数请求"},
            };

            var filePath = @"d:\image\shui.jpg";
            using (var fileStream = File.Open(filePath, FileMode.Open))
            {
                var bytes = new byte[fileStream.Length];
                fileStream.Read(bytes, 0, bytes.Length);
                using (var client = new HttpClient())
                {
                    var message = new HttpRequestMessage(HttpMethod.Post, "https://xxx/email/SendEmailIncludeAttach");
                    message.Content = CreateContent(bytes, dic);
                    var responseMessage = await client.SendAsync(message);
                    if (responseMessage.IsSuccessStatusCode)
                    {
                        var resStr = await responseMessage.Content.ReadAsStringAsync();
                        Console.WriteLine(resStr);
                    }
                }
            }

            Console.ReadKey();

        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值